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 }

 

posted on 2014-03-10 21:38  round_0  阅读(353)  评论(0编辑  收藏  举报

导航