通过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;
}