题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002
image.png
解析放下代码里:
代码如下:
#pragma warning(disable:4996)
#include<vector>
#include<iostream>
#include<cstdio>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
struct BigInteger {
static const int BASE = 100000000;
static const int WIDTH = 8;
vector<int> s;
BigInteger(long long num = 0)
{
*this = num;
}
BigInteger operator=(long long num)
{
s.clear();
do {
s.push_back(num%BASE);
num /= BASE;
} while (num > 0);
return *this;
}
BigInteger operator=(const string& str)
{
s.clear();//清空字符串
int x, len = (str.length() - 1) / WIDTH + 1;//字符串宽度,每九位,其实和上面的意思是一样的
for (int i = 0; i < len; i++) {
int end = str.length() - i * WIDTH;//
int start = max(0, end - WIDTH);
sscanf(str.substr(start, end - start).c_str(), "%d", &x);
s.push_back(x);
}
return *this;
}
BigInteger operator +(const BigInteger& b)const {//这个const说实话不知道什么意思,两个数相加【bigint1+bigint2】,左边的是本对象,右边的是b对象
BigInteger c;//定义一个大整数对象
c.s.clear();//c对象数组清空
for (int i = 0, g = 0;; i++)
{
if (g == 0 && i >= s.size() && i >= b.s.size()) //如果位数已经到了最高位,i大于本对象,且大于b对象的大小
break;//跳出循环
int x = g;//int型
if (i < s.size())
{
x += s[i];//值只有单单一个0,分割放送,一0补8个0,一般只有加到最后一位,x才会有非零值,这里的+=也不是重载的
//cout << "x=" << x << endl;
//cout <<"s[i]="<< s[i] << endl;
}
if (i < b.s.size())
{
x += b.s[i];//如果他们两个同时在八个位内能够有值,他们就能够同时相加
//cout <<"b.s[i]="<< b.s[i] << endl;
}
c.s.push_back(x%BASE);//新数组给他安排上
g = x / BASE;//得到最高位向后的位数(一直到从右向左出现的第一次8位前面停止)
}
return c;
}
};
ostream& operator << (ostream &out, const BigInteger& x) {
out << x.s.back();
for (int i = x.s.size() - 2; i >= 0; i--) {
char buf[20];
sprintf(buf, "%d", x.s[i]);
for (int j = 0; j < strlen(buf); j++) out << buf[j];
}
return out;
}
istream& operator >> (istream &in, BigInteger& x) {
string s;
if (!(in >> s))//赋值不成功就返回,成功了就x=s;
{
return in;
}
x = s;
return in;
}
int main()
{
BigInteger bigint1;//像用int定义一样直接定义,引用了构造器1
BigInteger bigint2;
int i,t;
cin >> t;
for(i=0;i<t;i++)
{
cin >> bigint1;
cin >> bigint2;
cout << "Case " << i + 1 << ":" << endl;
cout << bigint1 << " + " << bigint2 << " = ";
cout << bigint1 + bigint2 << endl;
if (i<t-1) cout << endl;
}
return 0;
}
