#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
#define fre freopen("/Users/LinkRay/Desktop/in.txt","r",stdin);//每个人的路径都不同,别照搬
const int MAXN = 10000+10;
// 用结构体进行了包装,不懂原理也可使用
// BigInt A 初始一个A的结构体
// A.read(字符串) 把字符串类型的数字放入A中
// 这里假设B也是一个BigInt C = A+B, C为A+B的值
// print为输出结果,用法为 C.print()
struct BigInt{
int num[MAXN];//大小可以根据所需修改MAXN
int len;
BigInt(){
memset(num, 0, sizeof(num));
len = 0;
}
BigInt operator + (const BigInt& r)const{ //进行加法,对+号进行了重载,可以直接用A+B
int maxLen = max(len, r.len);//取最长的数
BigInt res;
res.len = maxLen;
int jinwei = 0;
for(int i = 0; i < maxLen; ++i){
int tmp = num[i] + r.num[i];
tmp += jinwei;
jinwei = 0;
if(tmp >= 10){
jinwei = 1;
tmp %= 10;
}
res.num[i] = tmp;
}
if(jinwei){ // 如果最后还有进位,则需扩展一个1
res.num[len] = 1;
res.len++;//长度也要对应加1
}
return res;
}
void read(string& s){//把字符串放到BigInt中
int slen = s.length();
len = slen;
int p = 0;
for(int i = slen-1; i >= 0; --i){
num[p++] = s[i]-'0';
}
}
void read(char* s){//和上一个一样,上一个用来处理string类型
int slen = strlen(s);
len = slen;
int p = 0;
for(int i = slen-1; i >= 0; --i){
num[p++] = s[i]-'0';
}
}
void print(){//打印,可以去除前导0
int i;
for(i = len-1; i >= 0; --i)
if(num[i] != 0)
break;
for(; i >= 0; --i)
cout << num[i];
}
};
int main(){
// fre;
string num1, num2;
//用法实例
while(cin >> num1 >> num2){
BigInt A, B;
A.read(num1); //读取
B.read(num2);
BigInt C = A+B;
C.print();
cout << endl;
}
return 0;
}
大数加法模板
最新推荐文章于 2020-03-13 21:09:25 发布