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