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

文章目录

  • 题目描述
  • 一、高精度加法
  • 二、题解
    • 1.字符数组置逆
    • 2.值得注意的是...
    • 3.运行与测试
  • 写在最后


题目描述

高精度加法,相当于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存储进位的数

位数
a 1 0 0 1
b 9 9 0 9
c 0 0 1 0 1
是否进位 1 1 0 1
temp 1 1 0 1

计算结果为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 
#include  
#include 
#include 
#include 

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)

P1601 A+B Problem(高精)(洛谷题解) 高精度加法_第1张图片


写在最后

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

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

你可能感兴趣的:(ACM之路,#,洛谷题解,算法,c++,小程序)