1 #include2 #include 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;//去除尾033 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代码,表示自己还得继续努力啊!