2019.10.27 星期日(补昨天)
昨天看了场codeforces div3, 好难啊,有道题刚在洛谷oj上见过然后就被照搬了,dfs找环,直接做深搜然后用数组记录就行了,顺便提一下,打算做点有建设性的,光自己练太慢了,跟着刘汝佳书啃吧,md,dp乃万物之源,自己做了套高精度运算的模板,走你!秋假结束了,我终于也只剩6场考试就可以结束这个该死的学期了,挺住。
struct bigInt{//练习一下大数加减乘除
int num[128];//uint_128
int cnt;
bigInt():cnt(0){
memset(num, 0 , sizeof(num));//初始化为0
}
bigInt(const string &number):cnt(number.length()){
for(int i = cnt - 1 ; i >= 0; --i){
num[cnt - 1 - i] = number[i] - '0';
}
}
bigInt(ll number):cnt(0){
while(number){
num[cnt++] = number % 10;
number /= 10;
}
}
int length(){
return cnt;
}//记录长度
bigInt operator+(bigInt rhs){
int flag = 0;//进位标
bigInt tmp;
if(cnt > rhs.length()){
//如果我方大
int i;
for(i = 0 ; i < rhs.length(); ++i){
int sum = rhs.num[i] + num[i] + flag;
if(sum >= 10)flag = 1;
else flag = 0;
tmp.num[tmp.cnt++] = sum % 10;
}
for(; i < cnt ; ++i){
int sum = num[i] + flag;
if(sum >= 10){
flag = 1;
}else{
flag = 0;
}
tmp.num[tmp.cnt++] = sum % 10;
}
return tmp;
}else{
int i;
for(i = 0 ; i < cnt; ++i){
int sum = rhs.num[i] + num[i] + flag;
if(sum >= 10)flag = 1;
else flag = 0;
tmp.num[tmp.cnt++] = sum % 10;
}
for(; i < rhs.cnt ; ++i){
int sum = rhs.num[i] + flag;
if(sum >= 10){
flag = 1;
}else{
flag = 0;
}
tmp.num[tmp.cnt++] = sum % 10;
}
return tmp;
}
}
void print(){
for(int i = length() - 1 ; i >= 0 ; --i){
printf("%d", num[i]);
}
}
bool operator<(bigInt rhs){
if(length() < rhs.length()){
return true;
}else if(length() > rhs.length()){
return false;
}else{
for(int i = length() - 1; i >= 0 ; --i){
if(num[i] < rhs.num[i]){
return true;
}
if(num[i] > rhs.num[i]){
return false;
}
}
return false;
}
}
bool operator==(bigInt &rhs){
if(length() != rhs.length()){
return false;
}
for(int i = 0 ; i < length() ; ++i){
if(num[i] != rhs.num[i])return false;
}
return true;
}
bool operator>(bigInt rhs){
return rhs < *this && !(rhs == *this);
}
bool operator!=(bigInt rhs){
return !(*this == rhs);
}
int operator[](int i){
return num[i];
}
};
基本能用的功能都有了,我觉得乘除和减法也不常用就没写。