#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) }}