大数相加

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STRLENTH 100
/*数组转置*/
void reverse(char str[])
{
	int left = 0;//第一个元素
	int right = strlen(str)-1;//最后一个元素
	char temp;
	while(left < right)
	{
		temp = str[left];
		str[left] = str[right];
		str[right] = temp;
		left++;
		right--;
	}
}
char* big_num_add(char str1[],char str2[])
{
	int n1 = strlen(str1);	//求第一个加数的位数
	int n2 = strlen(str2);	//求第二个加数的位数
	int n = n1>n2 ? n1:n2;	//求两个加数中最大的位数
	int i = 0;
	int flag = 0;			//进位值,个位相加时,没有进位
	char sum ;				//每一位相加的和
	char *str3;				//存放和

/*存放加数的和,两个加数的最大位+两位,存放(''(reverse函数用到,strlen)及最高位有可能产生的进位)*/
	str3 = (char*)malloc(sizeof(char)*(n+2));

	n1--;//指向最低位的下标(从个位开始计算)
	n2--;
	while(n1 >= 0 && n2 >= 0)
	{
		/*求每一位上的和:本位和 + 进位*/
		sum = str1[n1] + str2[n2] + flag - '0';
		/*有进位*/
		if(sum > '9')
		{
			str3[i] = sum - 10;	//去掉进位后存于数组中
			flag = 1;			//有进位,加法进位只能是1
		}
		/*无进位*/
		else
		{
			str3[i] = sum;
			flag = 0;
		}
		/*为下一位做准备*/
		n1--;
		n2--;
		i++;
	}
	/*处理位数高的剩余位*/

	if(n1 > n2)//第一位没有处理完
	{
	//	for(;n1>=0;n1--)
		while(n1 >= 0)
		{
			sum = str1[n1] + flag ;//上一位的进位
			if(sum > '9')
			{
				str3[i] = sum - 10;	//去掉进位后存于数组中
				flag = 1;			//有进位,加法进位只能是1
			}
			else
			{
				str3[i] = sum;
				flag = 0;
			}
			n1--;
			i++;
		}
	}
	if(n2 > n1)//第二个加数,没有处理完
	{
		while(n2 >= 0)
		{
			sum = str2[n2] + flag ;//上一位的进位
			if(sum > '9')
			{
				str3[i] = sum - 10;	//去掉进位后存于数组中
				flag = 1;			//有进位,加法进位只能是1
			}
			else
			{
				str3[i] = sum;
				flag = 0;
			}
			n2--;
			i++;
		}
	}
	/*加完之后看看是否有进位:99+999,加完之后仍有进位*/
	if(flag == 1)
	{
		str3[i] = '1';
		i++;
		str3[i] = '';
	}
	else
		str3[i] = '';//和数组最后赋值''
/*上述操作执行完后,低位存到了前面,高位存在了后面,所以得转置过来*/
	reverse(str3);
	return str3;
}

int main()
{
	char add1[STRLENTH];
	char add2[STRLENTH];
	gets(add1);
	gets(add2);
	printf("the sum is:%s
",big_num_add(add1,add2));
	return 0;
}



原文地址:https://www.cnblogs.com/NikkiNikita/p/9527980.html