HDU1063Exponentiation
自我认为这是非常恶心的一道题,大数就算了,还带着小数,WA了数不清次数,最后没办法找网上的数据一个一个的试,发现浮点数保存有误差,例如5.1004读入后输出可以看到是5.100399999...。我用的是先把小数转换为整数进行大数运算,期间要记录要原始小数点后有效的小数位数,最后输出要用。为了保证转换为整数的时候是正确的,只能利用了四舍五入的方法。还有就是要注意n = 0和r,n都等于0的情况。
把丑陋的代码拿上来~~
1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 200 4 int pow10 (int n) 5 { 6 int i,pow = 1; 7 for (i = 1;i<=n;++i) 8 pow*=10; 9 return pow; 10 } 11 double pow_decimal (int n) 12 { 13 int i; 14 double sum = 1; 15 for (i = 0;i<=n;++i) 16 sum*=0.1; 17 return 5.0*sum; 18 } 19 int main () 20 { 21 int n,a,ans[maxn]; 22 char s[10]; 23 double r; 24 while (~scanf ("%s%d",s,&n)) 25 { 26 int i,j,count_decimal,cnt = 0,len = strlen (s); 27 /*Count the decimal*/ 28 for (i = len-1;i>=0;--i) 29 if (s[i]=='0')continue; 30 else break; 31 for (j = i;j>=0;j--) 32 if (s[j]!='.')cnt++; 33 else break; 34 if (j<0)count_decimal = 0; 35 else count_decimal = cnt; 36 /*turn double into int */ 37 sscanf (s,"%lf",&r); 38 r+=pow_decimal(count_decimal); 39 r = r*pow10(count_decimal); 40 a = (int)r; 41 if (!a && !n){printf ("1\n");continue;} 42 if (!a){printf ("0\n");continue;} 43 /*multiply*/ 44 memset (ans,0,sizeof (ans)); 45 ans[0] = 1; 46 int jin; 47 for(i = 0;i<n;++i) 48 { 49 jin = 0; 50 for (j = 0;j<maxn;++j) 51 { 52 int t = ans[j]*a+jin; 53 ans[j] = t%10; 54 jin = t/10; 55 } 56 } 57 for (i = maxn-1;i>=0;i--) 58 if (ans[i])break; 59 i++;cnt = i;count_decimal*=n; 60 /*print */ 61 if (cnt<=count_decimal) 62 { 63 if (count_decimal)printf ("."); 64 65 for (i = 1;i<=count_decimal-cnt;++i)printf ("0"); 66 for (i = cnt-1;i>=0;i--)printf ("%d",ans[i]); 67 } 68 else 69 { 70 for (i = cnt-1;i>count_decimal-1;--i) 71 printf ("%d",ans[i]); 72 if (count_decimal)printf ("."); 73 for (j = i;j>=0;--j) 74 printf ("%d",ans[j]); 75 } 76 printf ("\n"); 77 } 78 return 0; 79 }
弱者究竟为何而战?!