洛谷P1601 A+B Problem(高精)

本文详细介绍了一种使用数组模拟的高精度加法算法实现,适用于处理大整数加法问题,例如当输入的整数大小超过常规数据类型限制的情况。文章通过具体的代码示例,展示了如何处理不同长度的字符串相加,以及如何正确处理进位,确保计算结果的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b]

输入输出格式

输入格式:

 

分两行输入a,b<=10^500

 

输出格式:

 

输出只有一行,代表A+B的值

 

输入输出样例

输入样例#1: 复制

1
1

输出样例#1: 复制

2

思路:显而易见是通过数组来模拟,之前写过类似的,直接用了,不过以前写的太差了。

#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int main()
{                                          //肯定不是最优的,而且还很冗长,是我太菜了
	string a, b;
	char c[1000];                       //这里要用到char,因为我vs过不了,嘤嘤嘤
	int t, i, j, lag , m, o = 1, n;     //lag是进位,m是c数组的下标,用n赋值为t,下面会解释
	//cin >> t;
	//n = t;
	//while (t--)
	//{
		cin >> a >> b;
		m = 0; lag = 0;             //下面会将两个字符串相加一直到其中一个结束,因为位数不一定相等
		for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
		{                                           //size函数是计算字符串长度的
			c[m] = a[i] + b[j] - 48 + lag;      //根据asc码来运算,lag为进位
			lag = 0;                            //赋值0,只有有进位时才为1
			if (c[m]>57)
			{
				c[m] -= 10;
				lag = 1;
			}
			m++;
		}
		if (a.size() == b.size())          //如果字符串长度相等,证明已经相加结束,只判断最高位是否有进位
		{
			if (lag)                   //如果有,那么最高位只会为1
				c[m++] = 49;
		}
		if (a.size()>b.size())             //如果第一个字符串长,那么继续拿进位和第一个字符串相加,
		{                                  //比如说123+9,3与9相加后,1,2要继续和进位相加
			if (lag)                   //两种情况,第一种,有进位
			{
				for (; i >= 0; i--)  //i不用赋初值,因为i即为上次相加的位置
				{
					c[m] = a[i] + lag;
					if (c[m] > 57)   //这里应该不难理解
					{
						c[m] -= 10;
						lag = 1;
					}
					else
						lag = 0;
					m++;
				}
				if (lag)                //这是最高位计算后,再判断最高位是否有进位
					c[m++] = 49;
			}
			else                          //第二种情况,没有进位,则保持原值不用再计算
			{
				for (; i >= 0; i--)
					c[m++] = a[i];
			}
		}
		if (a.size()<b.size())                //当第二个字符串位数较多时同上
		{
			if (lag)
			{
				for (; j >= 0; j--)
				{
					c[m] = b[j] + lag;
					if (c[m] > 57)
					{
						c[m] -= 10;
						lag = 1;
					}
					else
						lag = 0;
					m++;
				}
				if (lag)
					c[m++] = 49;
			}
			else
			{
				for (; j >= 0; j--)
					c[m++] = b[j];
			}
		}
		//cout << "Case " << o << ":" << endl;    //最后要说一下输出,要严格按照题目要求,注意数字间有空格
		//cout << a << " + " << b << " = ";
		for (i = m - 1; i >= 0; i--)
			cout << c[i];
		cout << endl;                          //每组数据最后都要换行,endl就是换行的意思,但每两组数据间要空上一行
		//if (o<n)                               //所以要用到n,假如有3组数据,o初值为1,所以只有为1,2时才空行,即1与2,2与3之间空行
			//cout << endl;
		//o++;
	//}
	return 0;                                      //光A题题解就写到12点了,睡觉喽
}

 

转载于:https://www.cnblogs.com/aerer/p/9930953.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值