1 #include<iostream> 2 #include <stdio.h> 3 using namespace std; 4 #define MOD 10 5 #define END -1 6 7 int bignum[1000] ; 8 void MulBigSmall(int a[],int n) 9 { 10 int i, cc=0;//进位标志 11 for(i=1; i<= a[0] ; i++) 12 { 13 a[i] = a[i] * n+ cc; 14 cc= a[i] / MOD; 15 a[i] %= MOD; 16 } 17 while(cc) 18 { 19 a[i++] = cc% MOD; 20 cc/= MOD; 21 } 22 a[0] = i-1; 23 } 24 void output(int pos) 25 { 26 int i, j; 27 if(bignum[0] > pos)//字符数大于小数数 28 { 29 //输出小数点前的0 30 for(j=0, i= bignum[0] ; j< bignum[0] - pos; j++, i--) 31 printf("%d", bignum[i]) ; 32 for(j=1; bignum[j] ==0; j++) bignum[j] = END;//去除尾0 33 if(bignum[i] == END|| i==0) 34 return;//整数 35 printf(".") ; 36 for(; bignum[i] != END&& i>=1; i--) 37 printf("%d", bignum[i]) ; 38 } 39 40 else//字符数小于或等于小数数 41 { 42 printf(".") ; 43 for(i=0; i< pos- bignum[0] ; i++) 44 printf("0") ; 45 for(i=1; bignum[i] ==0; i++) bignum[i] = END;//去除0 46 for(i= bignum[0] ; bignum[i] != END&& i>=1;i--) 47 printf("%d", bignum[i]) ; 48 } 49 } 50 int main() 51 { 52 int i, power, num, pos; 53 char str[100] ; 54 while(~scanf("%s %d", str, &power)) 55 { 56 for(num=0, i=0, pos=5; i<6; i++) 57 { 58 if(str[i] =='.') pos= i; 59 else num= num*10+ str[i] -'0'; 60 } 61 pos= (5- pos) * power;//计算有n位小数 62 bignum[0] = bignum[1] =1; 63 while(power--) 64 MulBigSmall(bignum,num); 65 output(pos) ; 66 printf("\n") ; 67 } 68 return 0; 69 }
属于大数处理的题目,考虑的真的有好多,自己写的时候基本上没出现错误了,可是精度发生了问题,当输入为1.0100 和1时,输出却为1.0099,还有就是输入为0.0100和1时,输出的是0.0099……,我表示不知道怎么改,后来改用字符串存,却发现很多小数点的问题,真的被玩爆了,还有值得注意的是,测数据有可能有:000000和一个整数,或者是0000.00和一个整数的组合,应该输出是0的,还有输入的第一个数有可能不只是在100以内。纠结了很久,就看了别人的AC代码,表示自己还得继续努力啊!