HDU 1063 Exponentiation(高精度)

题目链接

此题和UVA上一模一样,可是数据不一样,都很变态,UVA上是一定有小数点,而杭电上不一定,UVA上在结果为0时,输出“.”而杭电上输出0。注意这个就能AC。

UVA上AC代码这里

  1 #include<stdio.h>
  2 #include<string.h>
  3 int k1[201],k2[201],o1[10];
  4 int main()
  5 {
  6     int  a,b,c,i,j,num,e,d;
  7     char p[10];
  8     while(scanf("%s%d",p,&num)!=EOF)
  9     {
 10         memset(k1,0,sizeof(k1));
 11         memset(k2,0,sizeof(k2));
 12         memset(o1,0,sizeof(o1));
 13         b=strlen(p);
 14         e = 0;//开始这个变量没初始化
 15         for(a=b-1,i=0; a>=0; a--,i++)
 16         {
 17             if(p[a] !='.')
 18             {
 19                 o1[i]=p[a]-'0';
 20                 k1[i]=p[a]-'0';
 21             }
 22             else
 23             {
 24                 e=i;
 25                 i--;
 26             }
 27         }
 28         for(i=2; i<=num; i++)
 29         {
 30             if(i%2==0)
 31             {
 32                 memset(k2,0,sizeof(k2));
 33                 for(a=0; a<=200; a++)
 34                 {
 35                     for(b=0; b<=8; b++)
 36                     {
 37                         k2[a+b]+=k1[a]*o1[b];
 38                     }
 39                 }
 40                 for(a=0; a<=200; a++)
 41                 {
 42                     if(k2[a]>=10)
 43                     {
 44                         k2[a+1]+=k2[a]/10;
 45                         k2[a]=k2[a]%10;
 46                     }
 47                 }
 48             }
 49             else
 50             {
 51                 memset(k1,0,sizeof(k1));
 52                 for(a=0; a<=200; a++)
 53                 {
 54                     for(b=0; b<=8; b++)
 55                     {
 56                         k1[a+b]+=k2[a]*o1[b];
 57                     }
 58                 }
 59                 for(a=0; a<=200; a++)
 60                 {
 61                     if(k1[a]>=10)
 62                     {
 63                         k1[a+1]+=k1[a]/10;
 64                         k1[a]=k1[a]%10;
 65                     }
 66                 }
 67             }
 68         }
 69         if(num%2==0)
 70         {
 71             c=0;
 72             for(j=0; j<=e*num-1; j++)
 73             {
 74                 if(k2[j]!=0)
 75                 {
 76                     break;
 77                 }
 78             }
 79             for(b=200; b>=j; b--)
 80             {
 81                 if(k2[b]!=0)
 82                     c=1;
 83                 if(b==e*num-1)printf(".");
 84                 if(c||b<=e*num-1)printf("%d",k2[b]);
 85             }
 86         }
 87         else
 88         {
 89             c=0;
 90             for(j=0; j<=e*num-1; j++)
 91             {
 92                 if(k1[j]!=0)
 93                 {
 94                     break;
 95                 }
 96             }
 97             for(b=200; b>=j; b--)
 98             {
 99                 if(k1[b]!=0)
100                     c=1;
101                 if(b==e*num-1)printf(".");
102                 if(c||b<=e*num-1)printf("%d",k1[b]);
103             }
104         }
105         if(c==0)printf("0");//这里输出的是"."
106         printf("\n");
107     }
108     return 0;
109 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/06/23/2559151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值