大数运算
此代码为算法竞赛入门经典上的代码,觉得不错,自己用手敲了一遍。
#include<string>
#include<algorithm>
#include<iostream>
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 = 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-WITDH);
sscanf(str.substr(start,end-start).c_str(),"%d",&x);
s.push_back(x);
}
return *this;
}
bigInteger operator + (const bigInteger & c) //重载加法
{
bigInteger y;
y.s.clear();
for (int i=0,g=0;;i++)
{
if (g==0 && i >=s.size() && i>=c.size()) {break;}
int x=g;
if (i<s.size()) {x += s[i];}
if(i<c.s.size()) {x += x.s[i];}
y.s.push_back(x % BASE);
g=x / BASE;
}
return y;
}
bigInteger operator > (const bigInteger & x)//重载大于运算符
{
if (s.size() ! = x.s.size()) {return s.size() > x.s.size();}
for (int i=0;i<s.size();i++)
{
if(s[i]!=x.s[i]) {return s[i] > x.s[i];}
}
return false;
}
}
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,"%08d",&x.s[i]);
for (int j=0;j<strlen(buf);i++)
{
out<<buf[j];
}
}
return out;
}
istream & operator >> (istream & in,bigInteger & x) //输入重载
{
x.s.claer();
string str;
if(!in>>str) {return in;}
x=str;
return in;
}