#P2171. 加法天才.填空题
加法天才.填空题
题目描述
贝贝是一个聪明的小孩,他总喜欢玩数字加法的游戏。一天,他的数学老师为了考一考他的能力,出了一道这样的题:要求他在短时间内计算出两个大数相加的结果。这两个大数可不是普通的数字,它们是 11 位以上的“庞然大物”。
请你编程序,帮贝贝解决这个问题。
输入格式
两行,分别是两个需要相加的数A和B,这两个数在 - 之间。
输出格式
1 行,是两个大数相加的结果。
样例
8569742356145896
215783669444444427
224353411800590323
算法思路
高精度运算是指 C++ 数字很大,精度很高,标准的数据类型已经没办法表达,需要自己定义类、结构体,结合适当的算法,完成大数据的加减乘除运算。
在算法竞赛里,高精度运算是一个专门的课题。
高精度运算本身不难,很类似我们用稿草纸进行计算。所以,本质上,它属于模拟算法,不是什么高精尖的东西。但是,模拟算法有时候很繁琐,所以,要做对做好也不是太容易。
高精度算法的模板非常非常多,我们今天介绍一种比较学院派的。这个模板不是最简单的(最简单的就是直接基于 string 来加),但是简单的方法会有很多局限性,而且要学到高精度的乘和除的时候,就不容易写对。下面这个模板做相应的扩展就能适应加减乘除。值得认真学习和消化。
程序填空
#include<bits/stdc++.h>
using namespace std;
struct hp{
int a[200];// 数组定义得越大,耗的内存越多
// 这是构造函数,初始化数据的时候用的,这个是没有参数的构造函数
hp(){
memset(a,0,sizeof a); // 初始化为 0 很重要
}
// C++ 支持函数的重载,可以有多个构造函数,这是构造函数是有参数的
hp(string s){
memset(a,0,sizeof a);
// 反向存储,个位放在 a[0]
for(int j=0,i=s.size()-1;i>=0;i--,j++)
a[j] = __填空(1)__;
}
// 构造函数必须和类(结构体)同名,这里结构体叫 hp ,所以构造函数也必须是 hp
void show(){
//要从高位开始输出,前面的 0 跳过不输出
bool f = true;
for(int i=199;i>=0;i--){
if(f&&a[i]==0) continue;
__填空(2)__;
printf("%d",a[i]);
}
if(f) printf("0"); // 意味着整个数组都是 0
printf("\n");
}
hp operator + (const hp &other) const{
hp tmp;// 定义临时变量,加运算的结果放在 tmp
for(int i=0;i<198;i++){
tmp.a[i] += a[i] + other.a[i]; // 特别留意,这里是 += 不是 =
tmp.a[i+1] += __填空(3)__; // 进位
tmp.a[i] = __填空(4)__;
}
return tmp;
}
};
int main(){
string tmp;
cin>>tmp; // 用字符串接收高精度数字
hp a = hp(tmp); //把 string 转成高精度类型的变量
cin>>tmp;
hp b = hp(tmp);
hp c = __填空(5)__;
c.show(); // 调用 成员函数 输出 高精度数据
return 0;
}
填空(1):{{ input(1) }}
填空(2):{{ input(2) }}
填空(3):{{ input(3) }}
填空(4):{{ input(4) }}
填空(5):{{ input(5) }}