#P2173. 超级计算器.填空题
超级计算器.填空题
题目描述
贝贝是学校信息学编程小组的学生,一天,他的数学老师碰到这样一个问题:他想求两个很长的数的乘积,但用普通的计算器无法完成计算,于是他请编程班的贝贝帮忙设计一个“超级计算器”,解决他所遇到的问题。
请你编一程序,帮贝贝解决这个问题。
输入格式
两行,分别是两个在10^100 以内的然数。
输出格式
两数相乘的结果。
样例
578474357954668
12435124571
7193400702295541350947428
完成程序
#include<bits/stdc++.h>
using namespace std;
struct hp{
int a[200];// 数组定义得越大,耗的内存越多
hp(){
memset(a,0,sizeof a); // 初始化为 0 很重要
}
hp(string s){
memset(a,0,sizeof a);
// 反向存储,个位放在 a[0]
for(int j=0,i=s.size()-1;i>=0;i--,j++)
a[j] = s[i] - '0';
}
void show(){
//要从高位开始输出,前面的 0 跳过不输出
bool f = true;
for(int i=199;i>=0;i--){
if(f&&a[i]==0) continue;
f = false;
printf("%d",a[i]);
}
if(f) printf("0"); // 意味着整个数组都是 0
printf("\n");
}
// const 表示常量,也就是说这些参数在函数内不能被修改
// & 表示引用传参,实参和形参是一个东西
// const 和 & 配套使用,可以是的参数不需要拷贝,也增加了程序的安全性
hp operator * (const hp &other) const{ // 高精度数乘 高精度
hp tmp;// 定义临时变量,加运算的结果放在 tmp
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
if(i+j<200) // 如果超出这个范围的就溢出了,结果就不正确了
__填空(1)__ += a[i]*other.a[j];
}
}
// 最后再来解决进位问题,i 不能到 199,否则就可能越界
// 如果最终 tmp.a[199] 大于 9 ,意味着溢出,数组定得不够大
// 一般考高精度的题目很少超过 200 长度的,这是经验。
// 200 已经很大很大了,这里是 O(n^2) 的复杂度 ,数组定得大就很容易超时和爆内存
for(int i=0;__填空(2)__;i++){
tmp.a[i+1] += __填空(3)__;
tmp.a[i] = __填空(4)__;
}
return tmp;
}
};
int main(){
string s;
cin>>s;
hp a = hp(s);
cin>>s;
hp b = hp(s);
hp c = __填空(5)__;
c.show(); // 调用 成员函数 输出 高精度数据
return 0;
}
填空(1):{{ input(1) }}
填空(2):{{ input(2) }}
填空(3):{{ input(3) }}
填空(4):{{ input(4) }}
填空(5):{{ input(5) }}