题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。
a
,
b
≤
1
0
500
a,b \leq 10^{500}
a,b≤10500
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 <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
实际输出
#2
预期输入
1001
9099
预期输出
实际输出
#3
预期输入
0
0
预期输出
10100
实际输出
#4
预期输入
11111111111111111111111111
9999999999999999999999999999999999
预期输出
10000000011111111111111111111111110
实际输出
洛谷OJ判别结果(100)
写在最后
本文作者才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,望悉知