求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 }