链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230
因为输出有问题,一直WA。。
大数+进制问题
数组一定要开大点。注意当两个要相加的数不一样长时的处理
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> int prime[25]; void isprime(void) { int i; int j=1; int t; bool sign; for (i=0;i<=25;i++) while(++j) { sign=true; for(t=2;t<=sqrt((double)j);t++) { if(j%t==0) { sign=false; break; } } if(sign) { prime[i]=j; break; } continue; } } int main() { isprime(); //打素数表 char cha[200]; char chb[200]; int ans[101]; char tem[50]; //暂存火星数字的一位 int temp; int sign; //进位标志 int i; int t; int k; int la,lb; while(scanf("%s%s",cha,chb)&&(cha[0]!='0'||chb[0]!='0')) //a或b为零时结束 { memset(ans,0,sizeof(ans)); sign=0; la=strlen(cha); lb=strlen(chb); for (i=la-1,t=la,k=0;i>=0;i--) { if(cha[i]==','||i==0) { if(i!=0) { strncpy(tem,cha+i+1,t-i-1); //把火星数字的一位复制到tem中 tem[t-i-1]='\0'; } else { strncpy(tem,cha+i,t-i); tem[t]='\0'; } t=i; ans[k++]=atoi(tem); //倒序 } } for (i=lb-1,t=lb,k=0;i>=0;i--) { if(chb[i]==','||i==0) { if(i!=0) { strncpy(tem,chb+i+1,t-i-1); tem[t-i-1]='\0'; } else { strncpy(tem,chb+i,t-i); tem[t]='\0'; } t=i; temp=atoi(tem); ans[k]+=(temp+sign); sign=ans[k]/prime[k]; ans[k]=ans[k]%prime[k]; k++; } } while(sign) //处理进位 { ans[k]+=sign; sign=ans[k]/prime[k]; ans[k]=ans[k]%prime[k]; k++; } sign=false; for (i=100;i>=0;i--) //倒序,从第一个不为0的数开始输出 { if(ans[i]!=0&&!sign) sign=true; if(sign&&i!=0) printf("%d,",ans[i]); if (sign&&i==0) printf("%d\n",ans[i]); } } return 0; }