高精度模版:
稍加整合
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
const int N = 2007;
struct BigNum{
int num[N];
int op;
int size;
BigNum(){
size=1, op=1;
memset(num, false, sizeof(num));
}
void Cin(){
char s[N];
scanf("%s", s);
size = strlen(s);
for(int i=0,k=size-1;i<size;++i){
if(s[i]=='-'){
k--;
op = -1;
}else{
num[k--] = s[i] - '0';
}
}
if(op == -1){
size--;
}
}
void GetText(int n){
size = log10(n)+1;
for(int i=0; i<size;++i){
num[i] = n % 10;
n /= 10;
}
}
bool operator <= (const BigNum &b)const{
if(size > b.size)return false;
if(size < b.size)return true;
for(int i=size-1; i>=0;--i){
if(num[i] > b.num[i])return false;
if(num[i] < b.num[i])return true;
}
return true;
}
void operator = (const BigNum &b){
size = b.size, op=b.op;
for(int i=0; i<b.size; i++){
num[i] = b.num[i];
}
}
void operator = (const int &b){
int x = b;
if(x < 0){
op = -1;
x = -x;
}
size = 0;
do{
num[size++] = x % 10;
x /= 10;
}
while(x);
}
BigNum operator * (const BigNum &b)const{
BigNum res;
res.op = b.op * op;
res.size = size + b.size - 1;
for(int i=0; i<b.size; i++){
for(int j=0; j<size; j++){
res.num[i+j] += num[j] * b.num[i];
}
}
res.CarryBit();
return res;
}
BigNum operator * (const int &b)const{
int x = b;
BigNum res;
res.size = size;
if(x < 0){
res.op = res.op * -1;
x = -x;
}
for(int i=0; i<size; i++){
res.num[i] = num[i] * x;
}
res.CarryBit();
return res;
}
friend BigNum operator + (BigNum a, BigNum b){
BigNum res;
if(a.op != b.op){
res = a - b;
b.op = b.op * -1;
}else{
res.op = a.op;
res.size = max(a.size, b.size);
for(int i=0; i<res.size; i++){
res.num[i] = a.num[i] + b.num[i];
}
res.CarryBit();
}
return res;
}
friend BigNum operator + (BigNum a, int b){
BigNum res;
res = b;
res = res + a;
return res;
}
friend BigNum operator - (BigNum a, BigNum b){
BigNum res;
b.op = b.op * -1;
if(a.op == b.op){
res = a + b;
}else{
if(a <= b)swap(a,b);
res.size = a.size;
res.op = a.op;
for(int i=0; i<res.size; i++){
if(i < b.size){
res.num[i] = a.num[i] - b.num[i];
}else{
res.num[i] = a.num[i];
}
}
res.BorrowBit();
}
return res;
}
friend BigNum operator - (BigNum a, int b){
BigNum res;
res = b;
res = a - res;
return res;
}
friend BigNum operator ^(const BigNum &_a, const int &_m){
BigNum result, a=_a;
result.num[0] = 1;
int m = _m;
while(m){
if(m & 1){
result = result * a;
}
a = a * a;
m >>= 1;
}
return result;
}
BigNum operator <<(const int &k)const{
BigNum tmp;
for(int i=size-1; i>=0; i--){
tmp.num[i+k] = num[i];
}
tmp.size = size + k;
tmp.CarryBit();
return tmp;
}
void CarryBit(){
for(int i=0; i<size; i++){
if(num[i] >= 10){
if(i+1==size){
num[i+1] = 0;
size += 1;
}
num[i+1] += num[i]/10;
num[i] %= 10;
}
}
while(size > 1 && !num[size-1]){
size--;
}
if(size == 1 && !num[0]){
op = 1;
}
}
void BorrowBit(){
for(int i=0; i<size; i++){
if(num[i] < 0){
num[i] += 10;
num[i+1] -= 1;
}
}
while(size > 1 && !num[size-1]){
size--;
}
if(size == 1 && !num[0]){
op = 1;
}
}
void Out(){
if(op == -1)
printf("-");
for(int i=size-1; i>=0; i--)
printf("%d", num[i]);
printf("\n");
}
};
int Find(const BigNum &a, BigNum &Mod){
int i;
BigNum t;
for(i=1; i<=9; i++){
t = (((a*2)<<1)+i) * i;
if(t <= Mod){
continue;
}
break;
}
i--;
t = (((a*2)<<1)+i) * i;
Mod = Mod - t;
return i;
}
BigNum Sqrt(const BigNum &a){
BigNum ans, Mod;
int len=a.size-1;
if(a.size % 2 == 0){
Mod = Mod + (a.num[len]*10+a.num[len-1]);
len -= 2;
}else{
Mod = Mod + a.num[len];
len -= 1;
}
ans = Find(ans, Mod);
while(len > 0){
Mod = (Mod<<2) + (a.num[len]*10+a.num[len-1]);
ans = (ans<<1) + Find(ans, Mod);
len -= 2;
}
return ans;
}
鸣谢出处:传送门