(转)大神写的高精度模板 C/C++
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX_N = 10000 + 10;
struct BigInt{
bool sign;
int s[MAX_N], len;
BigInt()
{
memset(s, 0, sizeof s);
sign = false;
len = 1;
}
BigInt(int num)
{
memset(s, 0, sizeof s);
sign = num < 0;
num = abs(num);
len = 1;
if ( !num )
len ++;
while ( num ) {
s[len ++] = num % 10;
num /= 10;
}
len --;
}
void Read()
{
int f;
while ( f = getchar(), !(f >= '0' && f <= '9') && f != '-' );
if ( f == '-' )
sign = true;
else
s[len ++] = f - '0';
while ( f = getchar(), f >= '0' && f <= '9' )
s[len ++] = f - '0';
len --;
for (int i = 1; i <= len>>1; i ++)
swap(s[i], s[len-i+1]);
if ( sign && len == 1 && !s[1] )
sign = false;
}
void Print()
{
if ( sign )
if ( len != 1 || s[1] )
printf("-");
for (int i = len; i; i --)
printf("%d", s[i]);
}
void DelPreZero()
{
while ( !s[len] && len - 1 )
len --;
}
};
BigInt operator += (BigInt &a, const BigInt &b);
BigInt operator -= (BigInt &a, const BigInt &b);
BigInt operator *= (BigInt &a, const BigInt &b);
BigInt operator /= (BigInt &a, const BigInt &b);
BigInt operator %= (BigInt &a, const BigInt &b);
BigInt Abs(const BigInt &a)
{
BigInt ans = a;
ans.sign = false;
return ans;
}
bool operator < (const BigInt &a, const BigInt &b)
{
if ( a.sign > b.sign )
return true;
if ( a.sign < b.sign )
return false;
if ( a.sign && b.sign )
return Abs(a) < Abs(b);
if ( a.len != b.len )
return a.len < b.len;
for (int i = a.len; i; i --) {
if ( a.s[i] < b.s[i] )
return true;
else if ( a.s[i] > b.s[i] )
return false;
}
return false;
}
bool operator > (const BigInt &a, const BigInt &b)
{
return b < a;
}
bool operator <= (const BigInt &a, const BigInt &b)
{
return !(a > b);
}
bool operator >= (const BigInt &a, const BigInt &b)
{
return !(a < b);
}
bool operator == (const BigInt &a, const BigInt &b)
{
return (a <= b && a >= b);
}
bool operator != (const BigInt &a, const BigInt &b)
{
return !(a == b);
}
int operator ! (const BigInt &a)
{
return a.len == 1 && !a.s[1];
}
BigInt operator - (const BigInt &a)
{
BigInt ans = a;
ans.sign = !a.sign;
return ans;
}
BigInt operator - (const BigInt &a, const BigInt &b);
BigInt operator + (const BigInt &a, const BigInt &b)
{
if ( a.sign ^ b.sign ) {
if ( a.sign )
return Abs(b) - Abs(a);
return Abs(a) - Abs(b);
}
if ( a.sign && b.sign )
return -(Abs(a) + Abs(b));
BigInt ans;
ans.len = max(a.len, b.len) + 1;
for (int i = 1; i <= ans.len; i ++)
ans.s[i] = a.s[i] + b.s[i];
for (int i = 2; i <= ans.len; i ++)
ans.s[i] += ans.s[i-1] / 10, ans.s[i-1] %= 10;
ans.DelPreZero();
return ans;
}
BigInt operator - (const BigInt &a, const BigInt &b)
{
if ( a.sign ^ b.sign ) {
if ( a.sign )
return -(Abs(a) + Abs(b));
return Abs(a) + Abs(b);
}
if ( a.sign && b.sign )
return Abs(b) - Abs(a);
if ( a < b )
return -(b - a);
BigInt ans;
ans.len = max(a.len, b.len);
for (int i = 1; i <= ans.len; i ++)
ans.s[i] = a.s[i] - b.s[i];
for (int i = 2; i <= ans.len; i ++)
ans.s[i] -= ans.s[i-1] < 0, ans.s[i-1] += (ans.s[i-1] < 0) * 10;
ans.DelPreZero();
return ans;
}
BigInt operator * (const BigInt &a, const BigInt &b)
{
BigInt ans;
ans.len = a.len + b.len;
ans.sign = a.sign ^ b.sign;
for (int i = 1; i <= a.len; i ++)
for (int j = 1; j <= b.len; j ++)
ans.s[i+j-1] += a.s[i] * b.s[j];
for (int i = 2; i <= ans.len+1; i ++)
ans.s[i] += ans.s[i-1] / 10, ans.s[i-1] %= 10;
ans.DelPreZero();
return ans;
}
BigInt operator / (const BigInt &a, const BigInt &b)
{
BigInt ans, last = 0;
ans.sign = a.sign ^ b.sign;
ans.len = a.len;
for (int i = a.len; i; i --) {
last = last * 10 + a.s[i];
int k;
for (k = 0; k <= 9; k ++)
if ( k * b <= last && (k+1) * b > last )
break;
ans.s[i] = k;
last -= k * b;
}
ans.DelPreZero();
return ans;
}
BigInt operator % (const BigInt &a, const BigInt &b)
{
if ( b == 0 || b == 1 )
return 0;
if ( b == 2 )
return a.s[1] & 1;
if ( a.sign )
return -(Abs(a) % Abs(b));
if ( !a.sign && b.sign )
return Abs(a) % Abs(b);
return a - ((a / b) * b);
}
BigInt operator += (BigInt &a, const BigInt &b)
{
return a = a + b;
}
BigInt operator -= (BigInt &a, const BigInt &b)
{
return a = a - b;
}
BigInt operator *= (BigInt &a, const BigInt &b)
{
return a = a * b;
}
BigInt operator /= (BigInt &a, const BigInt &b)
{
return a = a / b;
}
BigInt operator %= (BigInt &a, const BigInt &b)
{
return a = a % b;
}
BigInt operator ++ (BigInt &a)
{
return a += 1;
}
BigInt operator ++ (BigInt &a, int)
{
return ( a += 1 ) - 1;
}
BigInt operator -- (BigInt &a)
{
return a -= 1;
}
BigInt operator -- (BigInt &a, int)
{
return ( a -= 1 ) + 1;
}
int main()
{
return 0;
}
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh
浙公网安备 33010602011771号