大数相加

大数相加

题目:实现2个大整数(绝对值≤101000-1)相加(注:不允许写c=a+b;形式)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int length_a=0, length_b=0, length_c=0;	        /*记录加数、被加数和结果的长度*/

/*大整数的加法*/
void Add(int *a,int *b,int *result)
{
	int max = length_a, CY = 0, tmp = 0, flag = 1, i;
	if (max < length_b)							/*比较两个加数的长度*/
		max = length_b;							/*找出最大值*/	
	if (a[length_a - 1] < 0 && b[length_b - 1] < 0)			/*a+b,a<0,b<0*/
	{
		flag = 2;								/*flag置2*/
		a[length_a - 1] = b[length_b - 1] = 0;	/*数据最后一位'-1'置0*/
		length_a--; length_b--;					/*更新length_a、length_b*/	
		max--;									/*更新max变量*/	
	}
	else if (a[length_a - 1] > 0 && b[length_b - 1] < 0)		/*a+b,a>0,b<0*/
	{
		flag = 3;								/*flag置3*/
		b[length_b - 1] = 0;				    /*b最后一位'-1'置0*/
		length_b--;								/*更新length_b*/
		max = length_a;							/*比较两个加数的长度*/
		if (max < length_b)						/*找出最大值*/
			max = length_b;							
		for (i = max - 1; i >= 0; i--)          /*如果|a|<|b|,则交换a,b的位置*/
		{
			if (a[i] < b[i])					/*从最高位开始,如果a的某一位小于b*/
			{
				for (i = 0; i < max; i++)
				{
					tmp = a[i];
					a[i] = b[i];
					b[i] = tmp;
				}			
				flag = 4;						/*flag置4*/
				break;							/*跳出循环*/
			}
			else if (a[i] > b[i])				/*如果a的某一位大于b*/
			{
				break;							/*跳出循环*/			
			}
		}
	}
	else if (a[length_a - 1] < 0 && b[length_b - 1] >0)	/*a+b,a<0,b>0时转成b+a*/
	{
		flag = 3;								/*flag置3*/
		a[length_a - 1] = 0;					/*b最后一位'-1'置0*/
		length_a--;								/*更新length_a*/
		max = length_a;
		if (max < length_b)						/*更新max变量*/
			max = length_b;
		for (i = 0; i < max; i++)				/*交换a, b的位置*/
		{
			tmp = a[i];
			a[i] = b[i];
			b[i] = tmp;
		}
		for (i = max - 1; i >= 0; i--)			/*如果|a|<|b|,则交换a,b的位置*/
		{
			if (a[i] < b[i])	                /*从最高位,如果a的某一位小于b*/
			{
				for (i = 0; i < max; i++)
				{
					tmp = a[i];
					a[i] = b[i];
					b[i] = tmp;
				}
				flag = 4;						/*flag置4*/
				break;							/*跳出循环*/
			}
			else if (a[i] > b[i])			    /*如果a的某一位大于b*/
			{
				break;							/*跳出循环*/	
			}
		}
	}
	if (flag == 1 || flag == 2)								/*a>0,b>0和a<0,b<0这两种情况*/
	{
		for (i = 0; i <= max; i++) 
		{
			result[i] = a[i] + b[i] + CY;		/*a,b每一位相加,考虑前面的进位*/
			CY = 0;								/*进位标志清零*/
			if (result[i] > 9)					/*相加结果大于9*/
			{
				result[i] -= 10;				/*处理结果*/
				CY = 1;							/*产生进位*/
			}
		}
	}
	else if (flag == 3 || flag == 4)							/*a>0,b<0和a<0,b>0这两种情况*/
	{
		CY = 0;
		for (i = 0; i < max; i++)
		{
			result[i] = a[i] - b[i] - CY;       /*a,b每一位相减,考虑前面的借位*/
			CY = 0;								/*借位标志清零*/
			if (result[i] < 0)					/*相减结果小于0*/
			{
				result[i] += 10;				/*处理结果*/
				CY = 1;							/*产生借位*/
			}
		}
	}
	for (i = max; i >= 0; i--)
	{
		if (result[i] != 0)						/*定位到最高位的位置 */
		{
			tmp = i;							/*记录下这个位置 */
			break;								/*跳出循环 */
		}
	}			
	length_c = tmp + 1;							/*更新结果的length */
	if (flag == 2 || flag == 4)				/*a+b(a<0,b<0),a*b(a>0||b<0)的情况*/
		result[length_c - 1] *= -1;			     /*结果加负号*/
}

/*判断输入正确与否*/
void Judge(char *tmp)			
{
	if (strlen(tmp) >= 1000 && tmp[0] != '-' || strlen(tmp) >= 1001 && tmp[0] == '-')
	{
		printf("Error Input!");					/*正数的字符不超过1000个,负数不超过1001个*/
		exit(1);								/*退出程序*/
	}
}

int main(void)
{
	char A[1001], B[1001];
	int a[1001] = { 0 }, b[1001] = { 0 }, c[1001] = {0}, j;
	unsigned int i;
	printf("请输入一个大整数a:");
	gets_s(A,1001);								/*输入被加数a*/
	Judge(A);									/*判断输入正确与否*/
	printf("请输入一个大整数b:");
	gets_s(B,1001);								/*输入被加数b*/
	Judge(B);									/*判断输入正确与否*/
	for (i = 0; i < strlen(A); i++)				/*字符数组转成整型数组*/
	{
		a[strlen(A) - i - 1] = A[i] - '0';		/*逆序存放*/
		length_a++;								/*记录被加数a的长度(除负号)*/
	}	
	if (A[0] == '-')							/*如果是负数,数组的最后一个数置成-1*/
	{
		a[strlen(A) - 1] = -1;
	}	
	for (i = 0; i < strlen(B); i++)				/*字符数组转成整型数组*/
	{
		b[strlen(B) - i - 1] = B[i] - '0';		/*逆序存放*/
		length_b++;								/*记录加数b的长度(除负号)*/	
	}
	if (B[0] == '-')							/*如果是负数,数组的最后一个数置成-1*/
	{
		b[strlen(B) - 1] = -1;
	}
	Add(a,b,c);									/*调用加法函数*/
	printf("Output: ");
	for (j = length_c-1; j >= 0; j--)			/*输出结果*/
	{
		printf("%d",c[j]);
	}
	printf("\n");

	return 0;
}

在这里插入图片描述
在这里插入图片描述

大数相加通常是指处理超出标准数据类型(如int、long等)范围的大整数相加问题,在C语言中可以采用数组或字符串的方式来处理。当数值过大无法直接存储在整型变量中时,我们可以创建两个字符数组分别存储每一位数字,并按照从低位到高位的方式逐位相加。 小数相加同样如此,由于浮点数有精度限制,处理大数值的小数部分需要特别意溢出和精度损失的问题。一种常见的方法是使用double类型的变量存储,然后手动处理小数点后的操作。 以下是简单的示例代码: ```c #include <stdio.h> #include <string.h> // 函数声明 void addLargeNumbers(char *a, char *b, int len_a, int len_b); // 辅助函数,用于处理单个位数相加并考虑进位 char sumAndCarry(char a, char b) { int sum = a + b - '0'; return (sum > 9) ? (sum - 10 + '0') : sum + '0'; } // 主函数 void addLargeNumbers(char *a, char *b, int len_a, int len_b) { int i = 0, carry = 0; char result[len_a + len_b + 1]; // 空余一位放进位 while (i < len_a || i < len_b) { if (i < len_a) result[i] = a[len_a - 1 - i]; if (i < len_b) result[i] += carry + b[len_b - 1 - i] - '0'; carry = result[i] / 10; // 计算进位 result[i] = result[i] % 10; // 取结果的最后一位 ++i; } // 如果还有进位,添加到结果的最前面 if (carry != 0) result[0] = carry + '0'; result[len_a + len_b] = '\0'; // 结束标志 printf("Result: %s\n", result); } int main() { char largeNum1[] = "12345678901234567890"; char largeNum2[] = "98765432109876543210"; int len1 = strlen(largeNum1); int len2 = strlen(largeNum2); addLargeNumbers(largeNum1, largeNum2, len1, len2); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值