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\n",dig);
28 
29         p=0;
30         for(int i=0; i<N; i++)
31             p+=a[i];
32         if(p==0) {
33             printf("0\n");
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('\n');
80         } else if(dig<l) {
81             for(int i=h; i>dig; i--) {
82                 printf("%d",b[i]);
83             }
84             putchar('\n');
85         } else {
86             for(int i=h; i>=l; i--) {
87                 if(i==dig)
88                     putchar('.');
89                 printf("%d",b[i]);
90             }
91             putchar('\n');
92         }
93 
94     }
95     return 0;
96 }

 

posted @ 2016-01-26 16:47  闪耀子  阅读(149)  评论(0编辑  收藏  举报