大数类
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1000; struct Bign{ int len; //有效长度 int s[maxn]; //存放大数 //构造函数 ,变量初始化 Bign(){ memset(s,0,sizeof(s));len = 1;} //重载赋值操作,可以直接用 x = "123456789034" 的方式来为x赋值 //将字符串逆序存储在 int s[]内 Bign operator = (const char * num){ len = strlen(num); for(int i=0;i<len; i++) s[i] = num[len-i-1] - '0'; return *this; } Bign operator = (int num){ char s[maxn]; sprintf(s, "%d", num); *this = s; return *this; } Bign(int num){ *this = num; } Bign(const char* num){ *this = num; } string toString() const{ string str = ""; for(int i=len-1; i>=0; i--) str += (char)(s[i]+'0'); return str; } Bign operator + (const Bign &b ) const { Bign c; c.len = 0; int i,carry,maxl = max(len,b.len); for( i =carry =0; i<maxl; i++){ int tmp = s[i] + b.s[i] + carry; c.s[c.len++] = tmp % 10; carry = tmp / 10; } while(i<len) c.s[c.len++] += s[i++]; while(i<b.len) c.s[c.len++] += b.s[i++]; return c; } //去除数组中多余的0 void clear() { while(len>1 && !s[len-1])len--; } Bign operator * (const Bign &b) const { Bign c; c.len = len + b.len; //对于a的每一位 用 b的每一位去成一遍 for(int i=0; i<len; i++) for(int j=0; j<b.len; j++) c.s[i+j] += s[i] * b.s[j]; //处理进位 for(int i=0; i<c.len-1; i++){ c.s[i+1] += c.s[i] / 10; c.s[i] %= 10; } //去除多余0,更正c.len c.clear(); return c; } friend istream &operator >> (istream &in, Bign &n) { string s; in >> s; n = s.c_str(); return in; } friend ostream &operator << (ostream &out, const Bign &n) { out << n.toString(); return out; } }; int main () { Bign n1; n1 = "23784589493050034059009342324324"; cout << " n1 = " << n1 << endl; // n1 = 23784589493050034059009342324324 Bign n2; n2 = 1234567890; cout << " n2 = " << n2 << endl; // n2 = 1234567890 Bign n3("9787827383654329"); cout << " n3 = " << n3 << endl; // n3 = 9787827383654329 Bign n4(827383654); cout << " n4 = " << n4 << endl; // n3 = 827383654 Bign n5 = "78398249420049293949589999999"; Bign n6 = "1344234769898495120000001"; cout << " n5 + n6 = " << (n5+n6) << endl; // n5 + n6 = 78399593654819192444710000000 Bign n7 = "7293949589999999"; Bign n8 = "14769896431116"; cout << " n7 * n8 = " << (n7*n8) << endl; // n7 * n8 = 107730880018080996672543568884 }