对输入的字符串进行初始化,去掉前缀0,所有的0都统一为+0,不会有-0出现。输入会检查输入流状态,输出按照常规不输出正号。利用构造函数初始化列表先初始化私有数据成员可以提高效率,即直接调用string的构造函数先初始化,从而省去了先调用string默认构造函数,再在构造函数里面初始化私有数据成员的步骤。输入输出流要按常规返回流的引用。凡是引用的参数,如果不改变其值都要加const,如果是值传递则除非强制不能改变其值,否则不加const。
inline BigInt::BigInt() : num("+0"){} inline BigInt::BigInt(const string& strnum) : num(strnum) { if(num.size() > 0){ if(num[0] != '-' && num[0] != '+'){ string::size_type i = 0; for(; i < num.size() - 1 && num[i] == '0'; ++i); if(i > 0) num.replace(0, i, "+"); else num.insert(0, 1, '+'); } else { if(num.size() == 1) num = "+0"; else{ string::size_type i = 1; for(; i < num.size() - 1 && num[i] == '0'; ++i); if(i > 1) num.erase(1, i-1); if(num == "-0") num[0] = '+'; } } } else num = "+0"; } inline BigInt::BigInt(const BigInt& val) : num(val.num){} inline BigInt::BigInt(int n) { if(n >= 0) num = '+'; else { num = '-'; n *= -1; } string temp; while(n){ temp += n % 10 + '0'; n /= 10; } for(int i = temp.size() - 1; i >= 0; --i) num += temp[i]; } inline BigInt::BigInt(const char* str) : num(str) { if(num.size() > 0){ if(num[0] != '-' && num[0] != '+'){ string::size_type i = 0; for(; i < num.size() - 1 && num[i] == '0'; ++i); if(i > 0) num.replace(0, i, "+"); else num.insert(0, 1, '+'); } else { if(num.size() == 1) num = "+0"; else{ string::size_type i = 1; for(; i < num.size() - 1 && num[i] == '0'; ++i); if(i > 1) num.erase(1, i-1); if(num == "-0") num[0] = '+'; } } } else num = "+0"; } istream& operator>>(istream& in, BigInt& val) { in >> val.num; if(in){ if(val.num[0] != '-' && val.num[0] != '+'){ string::size_type i = 0; for(; i < val.num.size() - 1 && val.num[i] == '0'; ++i); if(i > 0) val.num.replace(0, i, "+"); else val.num.insert(0, 1, '+'); } else { if(val.num.size() == 1) val.num = "+0"; else{ string::size_type i = 1; for(; i < val.num.size() - 1 && val.num[i] == '0'; ++i); if(i > 1) val.num.erase(1, i-1); if(val.num == "-0") val.num[0] = '+'; } } } else val = BigInt(); return in; } ostream& operator<<(ostream& os, const BigInt& val) { if(val.num[0] == '-') os << val.num; else os << val.num.substr(1); return os; }
浙公网安备 33010602011771号