两个整型大数相加

/************************************************************************/
/*	大数加法 
	题目: 求两个100位数以内的加法   不含100位。
	分析:由于数据类型的溢出。所以不能使用基本的数据类型。应该使用字符串来
		  表示。
	数据结构:两个99位相加,和最多是100位。再加一个Null结束。101位。
	输入  运算  输出
	*/
/************************************************************************/

#include <stdio.h>
#include <string.h>
#define LEN_100	 100
#define SUM_LEN_101 101 
char *nizhi(char *p) //字符数组的逆置 
{	
	int len=strlen(p); 
	for(int i=0;i<len/2;++i) //注意最后的一个NULL不要算
	{
		char ctemp=p[i];
		p[i]=p[len-i-1];
		p[len-i-1]=ctemp;
	}
	return p;
}
/*函数: bignumadd
输入:字符数组a,字符数组b
输出:字符数组sum 
返回:字符数组sum
分析:两个大数相加。由于从末尾相加:所以按照末尾对齐。可以使用字符串逆置。
从Index=0对于位相加。相加有两个问题:一个是进位问题。一个是和问题。
carrybit=(carrybit+a[i]+b[i])/10; 取商更新carrybit;
sum[i]=(a[i]+b[i]+carrybit)%10; 值取余
判断最后一位是否有进位,有就sum[i]='1'否则为'0';
*/
char *bignumadd(const char *a,const char *b,char *sum)
{
	int cbit=0; //进位
	char ia[LEN_100]={0};
	char ib[LEN_100]={0};
	int lena=strlen(a);
	int lenb=strlen(b);
	for(int i=0;i<lena;i++) //字符数组变数字数组
		ia[i]=a[i]-'0';
	for(int i=0;i<lenb;i++) //字符数组变数字
		ib[i]=b[i]-'0';
	int i=0;
	for(;i<lena || i<lenb;i++)
	{
		sum[i]=(ia[i]+ib[i]+cbit)%10+'0'; //取余 sum[i]是字符 
		cbit=(ia[i]+ib[i]+cbit)/10; //取商 
	}
	if(cbit) //如果最后为1 则表示最末尾有进位
		sum[i]=1+'0';
	return sum;
}
void main()
{	
	while(1)
	{	char a[LEN_100]={0};	//初始化 最多99位 最多需要100位来存
		char b[LEN_100]={0}; //两个存储字符数组
		char sum[SUM_LEN_101]={0};
		printf("输入被加数a:\n");
		gets(a);
		nizhi(a);
		printf("输入加数b:\n");
		gets(b);
		nizhi(b);
		printf("和为:\n%s\n",nizhi(bignumadd(a,b,sum)));
	}

}
两个整型大数相加_第1张图片

参考:http://blog.csdn.net/insistgogo/article/details/6581466








   

你可能感兴趣的:(算法设计)