• HDU 1063 Exponentiation


    求N个大数的乘积

    题目要求很清楚,就是要注意的点太多了。

    数据:95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12 在做题的时候把dig想成了小数点后没用的0,一直做不出正确结果

    程序优化了两个大数的乘法的代码,不用考虑数的位数循环边界直接在最大的地方,少写了2行。

    n为0时输出1。

    输出时为了不输出没用的0,设两个变量l,h,l指前面第一个不为0的位数,h指后面第一个不为0的位数

    上代码

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 const int N=205;
     6 int main() {
     7     int a[N],b[N],c[N];
     8     char s[N];
     9     int n,l,h,p;
    10     freopen("C:\CODE\in.txt", "r", stdin);
    11    // freopen("C:\CODE\out.txt","w",stdout);
    12     while(~scanf("%s%d",s,&n)) {
    13         memset(a,0,sizeof(a));
    14         memset(b,0,sizeof(b));
    15         memset(c,0,sizeof(c));
    16         b[0]=1;
    17         int ii=0,dig=0;
    18         for(int i=5; i>=0; i--)
    19             if(s[i]!='.')
    20                 a[ii++]=s[i]-'0';
    21         for(int i=strlen(s)-1; s[i]!='.'; i--) {
    22             if(s[i]=='.')
    23                 break;
    24             dig++;
    25         }
    26 
    27         //printf("***********dig = %d
    ",dig);
    28 
    29         p=0;
    30         for(int i=0; i<N; i++)
    31             p+=a[i];
    32         if(p==0) {
    33             printf("0
    ");
    34             continue;
    35         }
    36 
    37 
    38 
    39         for(int k=0; k<n; k++) {
    40             //相乘
    41 
    42             for(int i=0; i<5; i++) {
    43                 for(int j=0; j<N; j++) {
    44                     c[j+i]+=b[j]*a[i];
    45                 }
    46             }
    47             for(int i=0; i<N; i++) {
    48                 if(c[i]>9) {
    49                     c[i+1]+=c[i]/10;
    50                     c[i]%=10;
    51                 }
    52 
    53             }
    54 
    55             for(int i=0; i<N; i++) {
    56                 b[i]=c[i];
    57             }
    58             memset(c,0,sizeof(c));
    59 
    60         }
    61 
    62         for(int i=0; i<N; i++)
    63             if(b[i]) {
    64                 l=i;
    65                 break;
    66             }
    67         for(int i=N-1; i>=0; i--)
    68             if(b[i]) {
    69                 h=i;
    70                 break;
    71             }
    72         //输出
    73         dig=n*dig-1;
    74         if(dig>=h) {
    75             putchar('.');
    76             for(int i=dig; i>=l; i--) {
    77                 printf("%d",b[i]);
    78             }
    79             putchar('
    ');
    80         } else if(dig<l) {
    81             for(int i=h; i>dig; i--) {
    82                 printf("%d",b[i]);
    83             }
    84             putchar('
    ');
    85         } else {
    86             for(int i=h; i>=l; i--) {
    87                 if(i==dig)
    88                     putchar('.');
    89                 printf("%d",b[i]);
    90             }
    91             putchar('
    ');
    92         }
    93 
    94     }
    95     return 0;
    96 }
    ---------------- 人们生成的最美好的岁月其实就是最痛苦的时候,只是事后回忆起来的时候才那么幸福。
  • 相关阅读:
    OnContextMenu事件
    一个不错的js制作的右键菜单
    用JS访问iframe中的元素
    Java中static、final用法小结
    Android系统层次结构及分析
    final 与static final修饰变量区别
    Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID,反之也行!
    js+css实现页面右键菜单
    编码和字符集的关系
    关于互联网开放的一点看法
  • 原文地址:https://www.cnblogs.com/livelihao/p/5160898.html
Copyright © 2020-2023  润新知