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