高精度大数的模板--c++代码
发布时间:2020-12-14 02:19:05 所属栏目:大数据 来源:网络整理
导读:(后续如果复习的话,加注释)上代码: #include iostream #includememory.h #includestring #includecstdlib using namespace std ; #define MAXVALUE 9999 class BigNum{ private : int a[ 500 ]; int len; public : BigNum(){ len= 1 ; memset (a, 0 , si
(后续如果复习的话,加注释)上代码: #include <iostream>
#include<memory.h>
#include<string>
#include<cstdlib>
using namespace std;
#define MAXVALUE 9999
class BigNum{
private:
int a[500];
int len;
public:
BigNum(){
len=1;
memset(a,0,sizeof(a));
}
BigNum(const int);
BigNum(const char* );
BigNum(const BigNum&);
BigNum & operator=(const BigNum&);
friend istream &operator>>(istream &,BigNum &);
friend ostream &operator<<(ostream &,BigNum &);
BigNum operator +(const BigNum &) const;
BigNum operator -(const BigNum &) const;
BigNum operator *(const BigNum &) const;
BigNum operator /(const int &)const;
BigNum operator^(const int &) const;
int operator %(const int &) const;
bool operator >(const BigNum &)const;
bool operator >(const int &)const;
void print();
};
BigNum::BigNum(const int b){
int tmp,d=b;
len=0;
memset(a,sizeof(a));
while(d>MAXVALUE){
//tmp=d-d/(MAXVALUE+1)*(MAXVALUE+1);
tmp=d%(MAXVALUE+1);
d=d/(MAXVALUE+1);
a[len++]=tmp;
}
a[len++]=d;
}
BigNum::BigNum(const char*s){
len=0;
memset(a,sizeof(a));
int l=strlen(s);
for(int i=l-1;i>=0;){
int tmp=1;int sum=0;
for(int j=0;j<4&&i>=0;j++,i--,tmp*=10){
sum+=(s[i]-'0')*tmp;
}
a[len++]=sum;
}
while(a[len-1]==0&&len>1)
len--;
}
BigNum::BigNum(const BigNum &T):len(T.len){
memset(a,sizeof(a));
for(int i=0;i<len;i++)
a[i]=T.a[i];
}
BigNum & BigNum::operator=(const BigNum &n){
len=n.len;
memset(a,sizeof(a));
for(int i=0;i<len;i++)
a[i]=n.a[i];
return *this;
}
istream &operator>>(istream& in,BigNum &b){
string ch;
in>>ch;//用cin代替in---测试好像没什么问题。
int l=ch.size();
int count=0;
for(int i=l-1;i>=0;){
int sum=0,t=1;
for(int j=0;j<4&&i>=0;j++,t*=10)
sum+=(ch[i]-'0')*t;
b.a[count++]=sum;
}
b.len=count;
return in;
}
ostream &operator <<(ostream &out,BigNum &b){
out<<b.a[b.len-1];//将out替换成cout---也么有什么问题。奇怪
for(int i=b.len-2;i>=0;i--){
out.width(4);
out.fill('0');
out<<b.a[i];
}
return out;
}
BigNum BigNum::operator+(const BigNum &T) const{
BigNum t(*this);
int big=T.len>len?T.len:len;
for(int i=0;i<big;i++){
t.a[i]+=T.a[i];
if(t.a[i]>MAXVALUE){
t.a[i+1]++;
t.a[i]-=MAXVALUE+1;
}
}
if(t.a[big]!=0)
t.len=big+1;
else
t.len=big;
return t;
}
BigNum BigNum::operator-(const BigNum &T)const{
BigNum t1,t2;
bool flag;
if(*this>T){
t1=*this;
t2=T;
flag=false;
}
else{
t1=T;
t2=*this;
flag=true;
}
int big=t1.len;
for(int i=0;i<big;i++){
if(t1.a[i]<t2.a[i]){
int j=i+1;
while(t1.a[j]==0)j++;
t1.a[j--]--;
while(j>i)t1.a[j--]+=MAXVALUE;
t1.a[i]+=MAXVALUE+1-t2.a[i];
}
else
t1.a[i]-=t2.a[i];
}
t1.len=big;
while(t1.a[t1.len-1]==0&&t1.len>1){
t1.len--;
}
if(flag)
t1.a[t1.len-1]=0-t1.a[t1.len-1];
return t1;
}
BigNum BigNum::operator*(const BigNum &T)const{
BigNum res;
int up;int i,j;
for(i=0;i<len;i++){
up=0;
for(j=9;j<T.len;j++){
int tmp=a[i]*T.a[j]+res.a[i+j]+up;
if(tmp>MAXVALUE){
int tmp1=tmp%(MAXVALUE+1);
up=tmp/(MAXVALUE+1);
res.a[i+j]=tmp1;
}
else{
up=0;
res.a[i+j]=tmp;
}
}
res.a[i+j]=up;
}
res.len=i+j;
while(res.a[res.len-1]==0&&res.len>1)
res.len--;
return res;
}
BigNum BigNum::operator/(const int &b)const{
BigNum res;
int i,down=0;
for(i=len-1;i>=0;i--){
res.a[i]=(a[i]+down*(MAXVALUE+1))/b;
down=a[i]+down*(MAXVALUE+1)-res.a[i]*b;
}
res.len=len;
while(res.a[res.len-1]==0&&res.len>1)
res.len--;
return res;
}
int BigNum::operator%(const int &b)const{
int i,d=0;
for(i=len-1;i>=0;i--){
//d=(d*(MAXVALUE+1)%b+a[i])%b;
d=(d*(MAXVALUE+1)+a[i])%b;
}
return d;
}
BigNum BigNum::operator^(const int& n)const{
BigNum t,ret(1);
if(n<0)
exit(-1);
if(n==0)
return 1;
if(n==1)
return *this;
int m=n;
t=*this;
for(;m!=0;m>>=1){
if(m&1)
ret=ret*t;
t=t*t;
}
return ret;
}
bool BigNum::operator>(const BigNum& T)const{
if(len>T.len)
return true;
else if(len==T.len){
int ln=len-1;
while(a[ln]==T.a[ln]&&ln>=0)
ln--;
if(ln>=0&&a[ln]>T.a[ln])
return true;
else
return false;
}
else
return false;
}
bool BigNum::operator>(const int &t)const{
BigNum b(t);
return *this>b;
}
void BigNum::print(){
int l=(*this).len;
cout<<*this;
cout<<"'s length ="<<l<<endl;
}
int main()
{
BigNum T;
BigNum T1("0909798798732");
cin>>T;
T.print();
T1.print();
int d=T%3;
cout << "Hello world!" << d<<endl;
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |