user-0 提问: POJ 1001 求高精度幂 ，样例通过，但是还是WA，怎么办？求大神帮助。

回复:
user: user-0
content: 还是没有搞定求助！！！

user: user-0
content: #include <stdio.h> #include <stdlib.h>  void Init(int s[250]);//初始化数组，使空位为10 void LongMul(int s1[250],int s2[250],int ans[250]);//超长整数乘法 void PrintLN(int s[250],int p);//输出结果  int main() {     int i,j,n,m,t,x;     int temp1[250],temp2[250];     char str[6];     struct decimal{         int s[250];         int p;//小数点位置         int d;     }data[100];     for(n=0;scanf("%s%d",str,&data[n].d)==2;n++){         for(m=0;str[m]!='.';m++)//确定输入值小数点位置             ;         data[n].p=(5-m)*data[n].d;//计算完成后小数点位置         Init(data[n].s);         for(i=0;str[i]!='.';i++)//将输入值小数点前后的数字复制到可计算的int数组内             data[n].s[i]=str[i]-'0';         for(;i<5;i++)             data[n].s[i]=str[i+1]-'0';         for(m=0;m<2;m++){//翻转数组             t=data[n].s[m];             data[n].s[m]=data[n].s[4-m];             data[n].s[4-m]=t;         }     }     for(i=0;i<n;i++){         Init(temp1);         Init(temp2);         LongMul(data[i].s,data[i].s,temp1);         for(j=0;j<(data[i].d-2);j++){//进行幂运算             LongMul(data[i].s,temp1,temp2);             for(m=0;temp2[m]!=10;m++)                 temp1[m]=temp2[m];             x=0;         }         PrintLN(temp1,data[i].p);//输出数值         if(i<n-1)             printf("\n");     }     return 0; }  void Init(int s[250]) {     int i;     for(i=0;i<250;i++)         s[i]=10; }  void LongMul(int s1[250],int s2[250],int ans[250]) {     int i,j,n,m,t;     int t1[250],t2[250],t3[250];     Init(t1);     Init(t2);     Init(t3);     t1[0]=s1[0]*s2[0]%10;//s1和s2的个位相乘     if(s1[0]*s2[0]>=10)         t=(s1[0]*s2[0]-s1[0]*s2[0]%10)/10;     else         t=0;     for(j=1;s2[j]!=10;j++){//s1的个位和s2整体相乘         t1[j]=(s1[0]*s2[j]+t)%10;         if(s1[0]*s2[j]+t>=10)             t=((s1[0]*s2[j]+t)-(s1[0]*s2[j]+t)%10)/10;         else             t=0;//当无须进位时，t归零     }     if(t!=0)//如果s1个位与s2最高位相乘大于10则进位，记录于t1         t1[j]=t;     for(i=1,m=1,t=0;s1[i]!=10;i++,m++,t=0){//s1和s2整体相乘，s1应短于s2         t2[0]=s1[i]*s2[0]%10;//s1的i位和s2的个位相乘         if(s1[i]*s2[0]>=10)//控制进位             t=(s1[i]*s2[0]-s1[i]*s2[0]%10)/10;         for(j=1;s2[j]!=10;j++){//s1的i位（此处大循环中不变）和s2的j位逐步相乘，得到t2             t2[j]=(s1[i]*s2[j]+t)%10;             if(s1[i]*s2[j]+t>=10)//控制进位                 t=((s1[i]*s2[j]+t)-(s1[i]*s2[j]+t)%10)/10;             else                 t=0;//当无须进位时，t归零         }         if(t!=0)//当到达最高位时，使最高位等于所进位数             t2[j]=t;         t3[0]=t1[0];//填补t3的1位（需要手动）         if(t1[m]+t2[0]<10){//t1的m位和t2的m位相加，得到t3的m位             t=0;             t3[m]=t1[m]+t2[0];         }         else{             t=((t1[m]+t2[0])-(t1[m]+t2[0])%10)/10;             t3[m]=(t1[m]+t2[0])%10;         }         for(n=1;t1[n+m]!=10;n++){//t1和t2从m+1位开始，逐位相加             t3[n+m]=(t1[n+m]+t2[n]+t)%10;             if(t1[n+m]+t2[n]+t>=10)//控制进位                 t=((t1[n+m]+t2[n]+t)-(t1[n+m]+t2[n]+t)%10)/10;             else                 t=0;         }         if(t1[n+m]==10&&t2[n]!=10){//当t2位数比t1长时，将t2的超出位填补入t3的高位             for(;t2[n]!=10;n++){                 t3[n+m]=(t2[n]+t)%10;                 t=((t2[n]+t)-(t2[n]+t)%10)/10;             }             if(t==1){//当t2比t1的和比t2长时进一位                 t3[n+m]=1;             }             if(t3[n+m]==0)                 t3[n+m]=10;         }         else if(t1[n+m]==10&&t2[n]==10&&t!=0)             t3[n+m]=t;         for(n=0;t3[n]!=10;n++)//将临时储存数组t3复制给t1             t1[n]=t3[n];         Init(t2);     }     for(n=0;t3[n]!=10;n++)//将最后的结果t3传递给ans作为输出         ans[n]=t3[n]; }  void PrintLN(int s[250],int p) {     int i,n,m;     for(n=0;s[n]!=10;n++)//指针到达结果的最高位（从最高位输出）         ;     for(m=0;s[m]==0&&m!=p;m++)//记录真实数值的末尾有几个零         ;     if(s[n-1]==0)//去除真实数值最高位的零         n--;     for(i=n-1;i>=p;i--)//输出至小数点处         printf("%d",s[i]);     if(p==m)//输出小数点         ;     else         printf(".");     for(;i>=m;i--)//输出小数点后的数         printf("%d",s[i]); }

user: user-0
content: 发全了……但是被吞了。点击查看源代码就可以了。

user: user-1
content: 代码发全。。

user: user-0
content: 求帮助˃̣̣̥᷄⌓˂̣̣̥᷅

user: user-0
content: #include <stdio.h> #include <stdlib.h>  void Init(int s[250]);//初始化数组，使空位为10 void LongMul(int s1[250],int s2[250],int ans[250]);//超长整数乘法 void PrintLN(int s[250],int p);//输出结果  int main() {     int i,j,n,m,t,x;     int temp1[250],temp2[250];     char str[6];     struct decimal{         int s[250];         int p;//小数点位置         int d;     }data[100];     for(n=0;scanf("%s%d",str,&data[n].d)==2;n++){         for(m=0;str[m]!='.';m++)//确定输入值小数点位置             ;         data[n].p=(5-m)*data[n].d;//计算完成后小数点位置         Init(data[n].s);         for(i=0;str[i]!='.';i++)//将输入值小数点前后的数字复制到可计算的int数组内             data[n].s[i]=str[i]-'0';         for(;i<5;i++)             data[n].s[i]=str[i+1]-'0';         for(m=0;m<2;m++){//翻转数组             t=data[n].s[m];             data[n].s[m]=data[n].s[4-m];             data[n].s[4-m]=t;         }     }     for(i=0;i<n;i++){         Init(temp1);         Init(temp2);         LongMul(data[i].s,data[i].s,temp1);         for(j=0;j<(data[i].d-2);j++){//进行幂运算             LongMul(data[i].s,temp1,temp2);             for(m=0;temp2[m]!=10;m++)                 temp1[m]=temp2[m];             x=0;         }         PrintLN(temp1,data[i].p);//输出数值         if(i<n-1)             printf("\n");     }     return 0; }  void Init(int s[250]) {     int i;     for(i=0;i<250;i++)         s[i]=10; }  void LongMul(int s1[250],int s2[250],int ans[250]) {     int i,j,n,m,t;     int t1[250],t2[250],t3[250];     Init(t1);     Init(t2);     Init(t3);     t1[0]=s1[0]*s2[0]%10;//s1和s2的个位相乘     if(s1[0]*s2[0]>=10)         t=(s1[0]*s2[0]-s1[0]*s2[0]%10)/10;     else         t=0;     for(j=1;s2[j]!=10;j++){//s1的个位和s2整体相乘         t1[j]=(s1[0]*s2[j]+t)%10;         if(s1[0]*s2[j]+t>=10)             t=((s1[0]*s2[j]+t)-(s1[0]*s2[j]+t)%10)/10;         else             t=0;//当无须进位时，t归零     }     if(t!=0)//如果s1个位与s2最高位相乘大于10则进位，记录于t1         t1[j]=t;     for(i=1,m=1,t=0;s1[i]!=10;i++,m++,t=0){//s1和s2整体相乘，s1应短于s2         t2[0]=s1[i]*s2[0]%10;//s1的i位和s2的个位相乘         if(s1[i]*s2[0]>=10)//控制进位             t=(s1[i]*s2[0]-s1[i]*s2[0]%10)/10;         for(j=1;s2[j]!=10;j++){//s1的i位（此处大循环中不变）和s2的j位逐步相乘，得到t2             t2[j]=(s1[i]*s2[j]+t)%10;             if(s1[i]*s2[j]+t>=10)//控制进位                 t=((s1[i]*s2[j]+t)-(s1[i]*s2[j]+t)%10)/10;             else                 t=0;//当无须进位时，t归零         }         if(t!=0)//当到达最高位时，使最高位等于所进位数             t2[j]=t;         t3[0]=t1[0];//填补t3的1位（需要手动）         if(t1[m]+t2[0]<10){//t1的m位和t2的m位相加，得到t3的m位             t=0;             t3[m]=t1[m]+t2[0];         }         else{             t=((t1[m]+t2[0])-(t1[m]+t2[0])%10)/10;             t3[m]=(t1[m]+t2[0])%10;         }         for(n=1;t1[n+m]!=10;n++){//t1和t2从m+1位开始，逐位相加             t3[n+m]=(t1[n+m]+t2[n]+t)%10;             if(t1[n+m]+t2[n]+t>=10)//控制进位                 t=((t1[n+m]+t2[n]+t)-(t1[n+m]+t2[n]+t)%10)/10;             else                 t=0;         }         if(t1[n+m]==10&&t2[n]!=10){//当t2位数比t1长时，将t2的超出位填补入t3的高位             for(;t2[n]!=10;n++){                 t3[n+m]=(t2[n]+t)%10;                 t=((t2[n]+t)-(t2[n]+t)%10)/10;             }             if(t==1){//当t2比t1的和比t2长时进一位                 t3[n+m]=1;             }             if(t3[n+m]==0)                 t3[n+m]=10;         }