关于大整数的模板学习
#include<iostream>
#include<vector>
#include<string>
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++)//这个循环是,把一个长字符串,每8个字符存储在int的x中;substr是c++中的复制函数
{
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
{
BigInteger c;
c.s.clear();
for(int i=0,g=0;;i++)
{
if(g==0&&i>=s.size()&&i>=b.s.size())break;
int x=g;
if(i<s.size()) x+=s[i];
if(i<b.s.size()) x+=b.s[i];
c.s.push_back(x%BASE);//每两位相加,都要重新放入一个vector数组中。
g=x/BASE;
}
return c;
}
};
istream& operator >> (istream &in, BigInteger &b){
string x;
in>>x;
b=x;
return in;
}
ostream& operator << (ostream &out,const BigInteger &b){
int i;
char buf[20];//vector是倒着存储的。
out<<b.s.back();//(最高位)不足8位的预防处理 //如果输出是6位,再执行下面的会多加上两个00;使答案错误。不行你试试!
for(i=b.s.size()-2;i>=0;i--){
sprintf(buf,"%08d",b.s[i]);//不足8位补0//这个函数是从后往前;
//cout<<buf;
}
return out;
}
int main()
{
int n;
cin>>n;
BigInteger a,b;
int k=0;
while(n--)
{
if(k++) cout<<endl;
cin>>a>>b;
cout<<"Case "<<k<<":"<<endl;
cout<<a<<" + "<<b<<" = "<<a+b<<endl;
}
return 0;
}