poj1001 大数相乘 注意
注意乘法的模拟,位数的控制,还有是小数点的控制,最后是0的控制
#include<iostream> #include<cstdio> #include<string.h> using namespace std; char str[10]; int n, dot; int res[999999], a[999999], b[999999]; int len, lena, lenb; void mul() { int i,j; memset(res,0,sizeof(res)); for(i=1;i<=lena;i++)//这是大数相乘的精髓 { for(j=1;j<=lenb;j++) { res[i+j-1]+=a[i]*b[j];//注意i+j-1的为数控制,注意+号 if(res[i+j-1]>9) { res[i+j]+=res[i+j-1]/10; res[i+j-1]%=10; } } } if(res[lena+lenb-1]>9) { res[lena+lenb]+=res[lena+lenb-1]/10; res[lena+lenb-1]%=10; } lena=lena+lenb; for(i=1;i<=lena;i++)a[i]=res[i]; } int main() { int i, j, up, down; while (scanf("%s %d", str, &n)!=EOF) { dot=-1; for(i=5,j=1;i>=0;i--)//这个循环很妙啊,双向复制,还找出了小数点位置 { if(str[i]!='.')a[j]=b[j++]=str[i]-'0'; else dot=i; } if(dot==-1)lena=lenb=6; else lena=lenb=5; for(i=1;i<n;i++)mul(); if(dot==-1) { for(i=lena;i>=1;i--) printf("%d",a[i]); printf("\n"); }else { dot=5-dot; dot*=n; for(i=1;i<=lena;i++) { if(a[i]!=0) { down=i; break; } } for(j=lena;j>=1;j--) { if(a[j]!=0) { up=j; break; } } i=up; if(up<dot)i=dot;//小数点的控制加前导0后导0的控制 j=down; if(j>dot)j=dot+1; for(;i>=j;i--) { if(i==dot)printf("."); printf("%d",a[i]); } printf("\n"); } } return 0; }