信息学奥赛一本通|【例1.1】高精度加法、1168 大整数加法

1168:大整数加法

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 69283 通过数: 22982

【题目描述】

求两个不超过200位的非负整数的和。

【输入】

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

22222222222222222222 33333333333333333333

【输出样例】

55555555555555555555

【思路】

输入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在C++语言中任何数据类型都有一定的表示范围。而当两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,如图1。 这样,我们方便写出两个整数相加的算法。

在这里插入图片描述
如果我们用数组A、B分别存储加数和被加数,用数组C存储结果。则上例有A[1]=6,A[2]=5, A[3]=8,B[1]=5,B[2]=5,B[3]=2,C[4]=1,C[3]=1,C[2]=1,C[1]=1,两数相加如图2所示。
【源代码】

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char a1[201],b1[201];
	int a[201]={},b[201]={},c[201]={};//a,b,c分别存储被加数、加数、结果 
	scanf("%s",a1);
	scanf("%s",b1);
	int alen,blen,clen;
	alen=strlen(a1);
	blen=strlen(b1);
	clen=1;
	for(int i=0;i<alen;i++) a[alen-i]=a1[i]-'0';//通过字符串a1,b1把加数放入a,b数组 
	for(int i=0;i<blen;i++) b[blen-i]=b1[i]-'0';
	int x=0;
	while(clen<=alen||clen<=blen)
	{          
		c[clen]=a[clen]+b[clen]+x;//两数相加
		x=c[clen]/10;
		c[clen]%=10;
		clen++; 
	}
	c[clen]=x;//处理最高进位 
	for(int i=clen;i>=1;i--)//删除前导零 
	{
		if((c[i]==0)&&(clen>1)) clen--;
		else break;
		
	}
	for(int i=clen;i>=1;i--)//输出结果 
	{
		cout<<c[i];
	}
	cout<<endl;
	return 0;
}
### 信息学奥赛一本 - 大整数加法信息学竞赛中,大整数运算是一个常见的题目类型。由于计算机内置的数据类型(如 `int`、`long long` 等)有范围限制,当数字超过这个范围时,就需要使用特殊的方式来处理大整数。 #### 大整数加法的基本思路: 1. **字符串表示**: 因为普数据类型无法存储非常大的数字,所以常我们会将大整数用字符串的形式输入,并逐位进行计算。 2. **逆序存取**: 将两个大整数从低位到高位依次相加,可以方便地处理进位问题。因此,我们常常会先对字符串进行反转,然后按位相加。 3. **逐位相加并处理进位**: 对每一位进行相加操作,如果某一位的结果大于等于10,则需要向更高的一位进位。最后再检查最高位是否有进位。 4. **结果输出**: 计算完成后,记得去掉前导零并将结果再次反转回来。 下面给出一个简单的 C++代码来演示如何实现大整数加法: ```cpp #include <iostream> #include <string> using namespace std; // 实现大整数加法函数 string addBigNumbers(const string& num1, const string& num2) { int len1 = num1.size(); int len2 = num2.size(); // 补齐长度较短的数字前面补零 if (len1 > len2) { num2.insert(0, len1 - len2, '0'); } else { num1.insert(0, len2 - len1, '0'); } int maxLength = max(len1, len2); string result; int carry = 0; // 进位标志 for (int i = maxLength - 1; i >= 0; --i) { int sum = (num1[i] - '0') + (num2[i] - '0') + carry; carry = sum / 10; result.push_back(sum % 10 + '0'); // 只保留当前位数值 } if (carry != 0) result.push_back(carry + '0'); // 最后的进位别忘了加上去哦! reverse(result.begin(), result.end()); // 结果翻转回正常顺序 return result; } int main() { string a, b; cin >> a >> b; cout << "两数之和:" << addBigNumbers(a, b) << endl; return 0; } ``` 过以上步骤就可以完成基本的大整数加法了。当然,在实际比赛中可能会遇到更复杂的情况,比如负数等情况,这都需要额外考虑进去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1gongziyue

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

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

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

打赏作者

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

抵扣说明:

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

余额充值