1001 -- Exponentiation

http://poj.org/problem?id=1001

把数组大小从60改到100,500改到10000,居然忘记了改初始化方法里的循环条件,真是被自己蠢哭了.. 当年吃着东西一遍AC的题居然WA7次

代码后有从题目Discuss里扒来的测试数据

  1 #include<stdio.h>
  2 #include<string.h>
  3 char rOriginal[100];
  4 int r[100],resultTmp[10000],result[10000],posOfPoint/*小数位数*/,n;
  5 int flagOverOne;
  6 void init()
  7 {
  8     int i;
  9     //初始化接收数据的数组
 10     memset(rOriginal,0,sizeof(rOriginal));
 11     //初始化处理数据数组
 12     for(i=0; i<100; i++)//改了数组大小居然忘记了改初始化这里的循环条件
 13     {
 14         r[i]=0;
 15     }
 16     for(i=0; i<10000; i++)//改了数组大小居然忘记了改初始化这里的循环条件
 17     {
 18         result[i]=0;
 19         resultTmp[i]=0;
 20     }
 21     flagOverOne=1;
 22     posOfPoint=-1;
 23 }
 24 void dealROriginal()
 25 {
 26     int i=0,j=-1,k=5,t,p;//i指向有效数据的开始位置,j指向小数点的位置,k指向有效数据结束的位置
 27     int flagMeetPoint=0;
 28     //处理前面的垃圾数据
 29     if(rOriginal[0]=='0')
 30     {
 31         //通过rOriginal[0]是不是'0',判断输入的是不是0.xxxx格式小于1的小数
 32         //则R^n次方不可能大于1,则据题意输出结果时小数点前的0不可以输出
 33         flagOverOne=1;
 34         /*flagMeetPoint=1;
 35         i=2,j=1;*///把测试数据过于理想化了,贡献测试数据0001.1 1
 36     }
 37     while(rOriginal[i]!='\0'&&(rOriginal[i]=='.'||rOriginal[i]=='0'))
 38     {
 39         if(rOriginal[i]=='.')
 40         {
 41             flagMeetPoint=1;
 42             j=i;
 43         }
 44         i++;
 45     }
 46     if(i==6) //如果测试数据扯淡含0.00000
 47     {
 48         return;
 49     }
 50     //处理后面的垃圾数据
 51     while(k>=0&&(rOriginal[k]!='.'&&rOriginal[k]=='0'))//rOriginal[k]!='.'||rOriginal[k]=='0'
 52     {
 53         k--;
 54         //printf("%d--%c\n",k,rOriginal[k]);
 55     }
 56     if(rOriginal[k]=='.') //贡献测试数据10.000 25
 57     {
 58         flagMeetPoint=1;
 59         j=k;
 60         k--;
 61     }
 62     for(t=i; flagMeetPoint==0&&t<=k; t++)
 63     {
 64         if(rOriginal[t]=='.')
 65         {
 66             flagMeetPoint=1;
 67             j=t;
 68         }
 69     }
 70     if(flagMeetPoint==0) //输入的r中根本没有小数点
 71     {
 72         j=k=5;//把测试数据过于理想化了,贡献测试数据000010 1
 73     }
 74     //整理r
 75     for(t=k,p=1; t>=i; t--)
 76     {
 77         if(rOriginal[t]=='.')
 78         {
 79             continue;
 80         }
 81         r[p++]=rOriginal[t]-'0';
 82     }
 83     r[0]=p-1;
 84     result[0]=result[1]=1;
 85     //printf("i:%d,j:%d,k:%d\n",i,j,k);
 86     if(j>k)
 87     {
 88         posOfPoint=0;
 89     }
 90     else
 91     {
 92         posOfPoint=(k-j)*n;//结果中小数的位数
 93     }
 94 }
 95 int main()
 96 {
 97     int i,p,q;
 98     //freopen("test.in", "r", stdin);
 99     init();
100     while(scanf("%s%d",rOriginal,&n)!=EOF)
101     {
102         if(n==0)//按IEEE 754浮点数标准和c标准库函数,0^0 是1.
103         {
104             printf("1\n");
105             continue;
106         }
107         dealROriginal();
108         if(r[0]==0) //如果测试数据扯淡含0.00000
109         {
110             printf("0\n");
111             continue;
112         }
113         /*for(i=r[0];i>0;i--){
114             printf("%d",r[i]);
115         }
116         printf("r[0]=%d\n",r[0]);*/
117         //printf("n------%d\n",n);
118         for(i=0; i<n; i++) //result*r执行n次
119         {
120             for(p=1; p<=r[0]; p++)
121             {
122                 for(q=1; q<=result[0]; q++)
123                 {
124                     resultTmp[p+q-1]+=result[q]*r[p];
125                     //printf("%d %d\n",p+q-1,resultTmp[p+q-1]);
126                 }
127             }
128             resultTmp[0]=result[0]+r[0]-1;
129             //printf("%d+%d=%d\n",result[0],r[0],resultTmp[0]);
130             for(p=1; p<=resultTmp[0]; p++)
131             {
132                 resultTmp[p+1]+=resultTmp[p]/10;
133                 resultTmp[p]%=10;
134                 if(resultTmp[resultTmp[0]+1]!=0)
135                 {
136                     resultTmp[0]++;
137                 }
138             }
139             //printf("sssss%d\n",resultTmp[0]);
140             for(p=resultTmp[0]; p>=0; p--)
141             {
142                 result[p]=resultTmp[p];
143                 resultTmp[p]=0;
144             }
145             //printf("i:%d n:%d\n",i,n);
146             /*for(p=result[0]; p>0; p--)
147             {
148                 printf("%d",result[p]);
149             }*/
150             //printf("---%d\n",i);
151 
152         }
153         if(posOfPoint>result[0])
154         {
155             printf(".");
156             for(i=posOfPoint; i>0; i--)
157             {
158                 printf("%d",result[i]);
159             }
160             printf("\n");
161         }
162         else
163         {
164             for(i=result[0]; i>0; i--)
165             {
166                 if(i==posOfPoint)
167                 {
168                     printf(".");
169                 }
170                 printf("%d",result[i]);
171             }
172             printf("\n");
173         }
174         init();
175     }
176     return 0;
177 }

————————————————————

95.123 12

0.4321 20

5.1234 15

6.7592  9

98.999 10

1.0100 12

.00001  1

.12345  1

0001.1  1

1.1000  1

10.000  1

000.10  1

000000  1

000.00  1

.00000  0

000010  1

000.10  1

0000.1  1

00.111  1

0.0001  1

0.0001  3

0.0010  1

0.0010  3

0.0100  1

0.0100  3

0.1000  1

0.1000  3

1.0000  1

1.0000  3

1.0001  1

1.0001  3

1.0010  1

1.0010  3

1.0100  1

1.0100  3

1.1000  1

1.1000  3

10.000  1

10.000  3

10.001  1

10.001  3

10.010  1

10.010  3

10.100  1

10.100  3

99.000  1

99.000  3

99.001  1

99.001  3

99.010  1

99.010  3

99.100  1

99.100  3

99.998  1

99.998  3

转载于:https://www.cnblogs.com/JXNU-WuYeqi/articles/5378689.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值