链接: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;
}