通过C++将大数的操作放进类,制作成大数类(刘汝佳代码 + 自己添加的除法,次方,求余).
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 200
inline int max(int a,int b) { return a > b ? a : b; }
struct bign
{
//初始化.
int len, s[MAX];
bign() { memset(s,0,sizeof(s)); len = 1; }
bign(int num) { *this = num; }
bign(const char *num) { *this = num; }
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 str[MAX];
sprintf(str,"%d",num);
*this = str;
return *this;
}
//判断大小
bool operator< (const bign &b) const
{
if(len != b.len) return len < b.len;
for(int i = len-1; i >= 0; --i)
if(s[i] != b.s[i])
return s[i] < b.s[i];
return false;
}
int compare(const bign &b)
{
if(len > b.len) return 1;
if(len < b.len) return -1;
int i = len;
while( (i>1) && (s[i] == b.s[i]) ) i--;
return (s[i]-b.s[i]);
}
//辅助函数
void clean() { while(len > 1 && !s[len-1]) len--; }
string str() const
{
string res = "";
for(int i = 0; i < len; ++i)
res = (char)(s[i] + '0') + res;
if(res == "") res = "0";
return res;
}
//加减乘除
bign operator+ (const bign &b) const
{
bign c;
c.len = 0;
for(int i = 0,g = 0; g || i < max(len,b.len); ++i)
{
int x = s[i] + b.s[i] + g;
c.s[c.len++] = x % 10;
g = x / 10;
}
c.clean();
return c;
}
bign operator+= (const bign &b)
{
*this = *this + b;
return *this;
}
bign operator* (const bign &b)
{
int i, j;
bign c;
c.len = len + b.len;
for(i = 0; i < len; ++i)
{
for(j = 0; j < b.len; ++j)
{
c.s[i+j] += s[i] * b.s[j];
}
}
for(i = 0; i < c.len-1; ++i)
{
c.s[i+1] += c.s[i] / 10;
c.s[i] %= 10;
}
c.clean();
return c;
}
bign operator- (const bign &b)
{
bign c;
c.len = 0;
for(int i = 0,g = 0; i < len; ++i)
{
int x = s[i] - g;
if(i < b.len) x -= b.s[i];
if(x >= 0) g = 0;
else
{
g = 1;
x += 10;
}
c.s[c.len++] = x;
}
c.clean();
return c;
}
int operator/ (const bign &b)
{
int c = 0;
bign t = *this;
while(t >= b) { t = t-b; c++; }
return c;
}
//次方, 求余, 开方根.
bign pow(int cifang) //O(logn)
{
if(cifang == 0) return 1;
bign x = pow(cifang/2);
bign ans = x * x;
if(cifang % 2 == 1) ans = ans*(*this);
return ans;
}
bign operator% (const bign &b) //高精度对高精度效率高.
{ //大数对低精度的效率低
bign t;
t = *this;
while(t >= b)
t = t - b;
return t;
}
int mod(const int m) //高精度对小精度求mod
{
int ans = 0;
for(int i = len-1; i >= 0; --i)
ans = (int)( (ans*10+s[i]) % m);
return ans;
}
};
istream & operator>> (istream &in,bign &x)
{
string s;
in >> s;
x = s.c_str();
return in;
}
ostream & operator<< (ostream &out,const bign &x)
{
out << x.str();
return out;
}
int main()
{
bign a,b;
bign c;
cout << (bign)10 + (bign)2 << endl;
while(cin >> a >> b)
{
cout << a.pow(b) << " " << (a.pow(b)).len << endl;
cout << a+b << " " << (a+b).len << endl;
cout << a-b << " " << (a-b).len << endl;
cout << a*b << " " << (a*b).len << endl;
cout << a/b << " " << (a/b).len << endl;
cout << a%b << " " << (a%b).len << endl;
a = b = c;
}
return 0;
}