P1601 A+B Problem(高精)(洛谷题解) 高精度加法


题目描述

高精度加法,相当于a+b problem,不用考虑负数.

输入格式
分两行输入。 a , b ≤ 1 0 500 a,b \leq 10^{500} a,b10500
500

输出格式
输出只有一行,代表a+b的值

输入#1

1
1

输出#1

2

输入#2

1001
9099

输出#2

10100

一、高精度加法

高精度加法的核心思想就是当遇到比较大的数值时,使用数组存储各个位置的数值,temp存储进位,模拟我们在草稿纸上演算的过程,进行结果的计算,并将结果存储在数组当中。

原理如下:

注:这里就是洛谷测试数据集#2中的例子,在编程过程中,为了使输入输出更加方便,不用设置计数符号,通常将输入数字置逆。

个位与个位相加,观察是否进位,若有进位则使用temp存储进位的数

位数
a1001
b9909
c00101
是否进位1101
temp1101

计算结果为10100(逆序输出后),符合题意

反映到程序中,则主要为以下这段代码

		temp = a[i] + b[i]+ temp;	//本位 + 本位 + 上一位的进位数
		c[i] = temp % 10;	//取余只留下一位数
		temp /= 10;			//进位至下一位,权值除以十

二、题解

1.字符数组置逆

前文说过使用将字符串置逆的方法可以简化程序,只要初始化数组为0.则不用考虑因输入字符串长度不同的情况

本文主要使用如下方法将输入字符串置逆

	string A;
	string B;
	int a[500] = {};
	int b[500] = {};
	int c[600] = {};

	cin >> A >> B;
	
	for (int i = 0; i < A.size(); i++) {
		//置逆
		a[i] = A[A.size() - 1 - i] - '0';
	}
	for (int i = 0; i < B.size(); i++) {
		//置逆
		b[i] = B[B.size() - 1 - i] - '0';
	}

2.值得注意的是…

相信编写程序的过程并不复杂,但是很容易过不了OJ,在您的程序没AC时,请考虑以下几点情况

  • 数组是否越界。由于程序经过了将输入字符数组置逆这一个步骤,很容易会使得字符数组越界
  • 考虑a、b两个输入数字长度并不相等的情况。(洛谷OJ的第三个测试数据集)文章作者在将数组置逆的时候,误将两个操作合二为一,从而导致出错。
  • 考虑a = 0,b = 0的情况(洛谷OJ的第四个测试集)。

代码如下

#include <iostream>
#include <cstdio> 
#include <string>
#include <algorithm>
#include <stack>

using namespace std;

int main()
{
	string A;
	string B;
	int a[500] = {};
	int b[500] = {};
	int c[600] = {};
	
	cin >> A >> B;
	
	for (int i = 0; i < A.size(); i++) {
		//置逆字符串A
		a[i] = A[A.size() - 1 - i] - '0';
	}
	for (int i = 0; i < B.size(); i++) {
		//置逆字符串B
		b[i] = B[B.size() - 1 - i] - '0';
	}

	int temp = 0;//存储进位
	for (int i = 0; i < 500; i++)
	{//模拟手动计算进位
		temp = a[i] + b[i]+ temp;
		c[i] = temp % 10;
		temp /= 10;
	}
	
	bool flag = 0;
	for (int i = 599; i >= 0 ; i--)
	{//逆序输出,由于数组已经置逆,从第一个不为0的数字开始输出
		if (c[i] != 0)flag = 1;
		if (flag == 1)
			cout << c[i];
	}
	if (flag == 0) {
	//考虑0 + 0 = 0的情况
		cout << c[0];
	}

	return 0;
}

3.运行与测试

本文测试均采用visual studio 2019测试环境
#1

预期输入
1
1
预期输出
2

实际输出

测试集1

#2

预期输入
1001
9099
预期输出

实际输出
测试集2

#3

预期输入
0
0
预期输出
10100

实际输出

测试集3

#4

预期输入
11111111111111111111111111
9999999999999999999999999999999999
预期输出
10000000011111111111111111111111110

实际输出
测试集4


洛谷OJ判别结果(100)

洛谷OJ


写在最后

本文作者才疏学浅,若有纰漏,恳请斧正

本文章仅用于各位同志作为学习交流之用,不作任何商业用途,望悉知

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值