首页 > 其他 > 详细

HDU1063Exponentiation

时间:2014-03-11 15:55:35      阅读:503      评论:0      收藏:0      [点我收藏+]

  自我认为这是非常恶心的一道题,大数就算了,还带着小数,WA了数不清次数,最后没办法找网上的数据一个一个的试,发现浮点数保存有误差,例如5.1004读入后输出可以看到是5.100399999...。我用的是先把小数转换为整数进行大数运算,期间要记录要原始小数点后有效的小数位数,最后输出要用。为了保证转换为整数的时候是正确的,只能利用了四舍五入的方法。还有就是要注意n = 0和r,n都等于0的情况。

  把丑陋的代码拿上来~~

 

 

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

HDU1063Exponentiation,布布扣,bubuko.com

HDU1063Exponentiation

原文:http://www.cnblogs.com/GJKACAC/p/3592734.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!