POJ1001
高精度小数乘法,要注意0.xxxx输出的时候是.xxxx,以及考虑0的情况
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int N_MAX=100000; 8 struct Tnum{ 9 int bt[N_MAX],len,pt; 10 Tnum(){ len=pt=0; memset(bt,0,sizeof(bt)); } 11 int operator[](const int &p)const{ return bt[p]; } 12 void clear(){ len=pt=0; memset(bt,0,sizeof(bt)); } 13 int read(){ 14 clear(); 15 char ch=getchar(); 16 if (ch=='.') bt[++len]=0; 17 else{ 18 while ('0'>ch || ch>'9'){ 19 if (ch==EOF) return 1; 20 ch=getchar(); 21 } 22 } 23 while ('0'<=ch && ch<='9') bt[++len]=ch-'0',ch=getchar(); 24 pt=len; if (ch==' ') return 0; ch=getchar(); 25 while ('0'<=ch && ch<='9') bt[++len]=ch-'0',ch=getchar(); 26 return 0; 27 } 28 void print(){ 29 if (pt==1 && !bt[1]){ 30 putchar('.'); 31 for (int i=pt+1; i<=len; ++i) putchar('0'+bt[i]); 32 printf("\n"); 33 return; 34 } 35 for (int i=1; i<=pt; ++i) putchar('0'+bt[i]); 36 if (pt==len){ 37 printf("\n"); 38 return; 39 } 40 putchar('.'); 41 for (int i=pt+1; i<=len; ++i) putchar('0'+bt[i]); 42 printf("\n"); 43 } 44 void maintain(){ 45 for (int i=2; i<=len; ++i) if (bt[i]>=10) bt[i-1]+=bt[i]/10,bt[i]%=10; 46 while (!bt[len] && len>pt) --len; 47 while (!bt[1] && pt>1){ 48 for (int i=1; i<=len; ++i) bt[i]=bt[i+1]; 49 --pt; --len; 50 } 51 } 52 }a,b,c; 53 int n; 54 void work(){ 55 scanf("%d", &n); 56 a.maintain();b.clear();b=a;//printf("b=");b.print(); 57 if (!a[1] && a.len==1 && a.pt==1 && !n){ printf("1\n");return; } 58 if (!a[1] && a.len==1 && a.pt==1){ printf("0\n");return; } 59 if (!n){ printf("1\n");return; } 60 int tmp,x; 61 for (; n>=2; --n){ 62 c.clear(); tmp=x=0; c.len=a.len+b.len; c.pt=a.pt+b.pt; 63 for (int i=b.len; i>=1; --i){ 64 x=0; 65 for (int j=a.len; j>=1; --j){ 66 tmp=a[j]*b[i]; 67 c.bt[i+j]+=(tmp%10)+x; 68 x=tmp/10; 69 if (c.bt[i+j]>=10){ x+=(c.bt[i+j]/10);c.bt[i+j]%=10; } 70 //printf("tmp=%d x=%d\n", tmp, x); 71 } 72 if (x) c.bt[i]+=x; 73 } 74 //printf("c="); c.print(); printf("c.len=%d c.pt=%d\n", c.len, c.pt); 75 a=c; 76 } 77 a.maintain();a.print(); 78 } 79 int main(){ 80 //freopen("input","r",stdin); 81 //freopen("output","w",stdout); 82 while (!a.read()) work(); 83 return 0; 84 }

浙公网安备 33010602011771号