C语言大整数加法

C语言实现大整数加法

题目描述:
1:大整数加法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555


#include 
#include 

int 
main(void)	
{	
	int bigInteger_1[201] = {0}; // 用来存放大整数1的整型数组
	int bigInteger_2[201] = {0}; // 用来存放大整数2的整型数组
	char sNum_1[201] = {'\0'};  // 用来接收用户输入的字符串形式的大整数1
	char sNum_2[201] = {'\0'}; // 用来接收用户输入的字符串形式的大整数2
	
	//输入大整数1和大整数2
	scanf("%s %s", sNum_1, sNum_2);
	
	/*
		这两个循环的功能均是将字符串中的字符大整数,转换为int型数组中的整型值
		并且转换后的int型数组中的低位序存储的是大整数的低位,即bigInteger_1[0]
		存放的是大整数的个位,依次类推
	*/
	for (int i = 0, j = strlen(sNum_1) - 1; j >= 0; )
	{
		bigInteger_1[i++] = sNum_1[j--] - '0';
	}
	for (int i = 0, j = strlen(sNum_2) - 1; j  >= 0; )
	{
		bigInteger_2[i++] = sNum_2[j--] - '0';
	}
	
	//进行大整数的加法
	int k = 0;
	while (k <= 200)
	{
		bigInteger_1[k] += bigInteger_2[k]; //将大整数从低位到高位依次相加
		
		if (bigInteger_1[k] >= 10)
		{
			bigInteger_1[k+1]++;
			bigInteger_1[k] -= 10;
		} 
		k++;
	}
	
	/*
		去除前导零将大整数加法的结果进行输出,思路是,从加完后的大整数的最高位开始寻找
		找到第一个不为零的数字后,记录这个不为零的数字在bigInteger数组中的索引,如果全部
		数字全部为零,那么就输出零,否则就输出大整数中第一个不为零的数字及其后面的所有
		数字。
	*/
	int mark = 0; // 用来记录第一个不为零的数字的索引
	int i = 0;
	for (i = 200; i >= 0; i--)
	{
		if (bigInteger_1[i] != 0)
		{
			mark = i; // 记录大整数中第一个不为零的数字的索引 
			break; // 结束循环
		}
	}
	
	/*
		如果i的值等于-1,说明遍历完大整数数组,也没有发现大整数数组中有存在非零的数
		因此就可以判定大整数加完之后的结果就是零
	*/
	if (i == -1)
	{
		printf("0\n");
	}
	else
	{
		for (int i = mark; i >= 0; i--)
		{
			printf("%d", bigInteger_1[i]); // 从大整数中第一个不为零的索引开始进行遍历输出
		}
		putchar('\n');
	}
	return 0;
}

提交结果
C语言大整数加法_第1张图片
注意事项:

  1. 忘记将bigInteger数组进行初始化,因为如果忘记将该数组中的全部内容全部初始化,就会导致数组中的全部初始值就是不确定的,这样在去除前导零时就会出错
  2. 在将字符串中的字符数字转换到int型数组中时,一定要分清楚int型数组的低位序存放的是大整数的低位还是高位,因为这样会影响大整数的加法操作
  3. 在进行大整数加法时,一定要从大整数的最低位开始相加,相加时不要忘记进位

你可能感兴趣的:(openjudge练习笔记)