大整数加减乘除

来源:互联网 发布:ubuntu设置断电自启动 编辑:程序博客网 时间:2024/05/16 16:11

LOW-END 版:



#include <iostream>#include <iomanip>#include <cstring>#include <string>using namespace std;const int MAX=9999;class Bignum{private:int num[50];int len;public:bool operator<(const Bignum& A){if(*this>A ||  *this==A)return false;else return true;}void getlen( ){cout<<"长度为" <<len<<endl;}Bignum(){len=0; memset(num,0,sizeof(num));}Bignum(const Bignum& b){len=b.len;for (int i=0;i<len;i++){num[i]=b.num[i];}}bool operator>(const Bignum& );bool operator==(const Bignum&);friend istream& operator>>(istream& in,Bignum&);friend ostream& operator<<(ostream& os,Bignum&);Bignum& operator>>(int leng);Bignum(const int );Bignum(const char*);Bignum& operator=(const Bignum&);Bignum operator+(const Bignum&);Bignum operator-(const Bignum&);Bignum operator*(const Bignum&);Bignum operator/(const Bignum&);//Bignum& operator>>(int leng);};/*Bignum& Bignum::operator<<(int leng){int b=len-leng;if ( b <=0 ){return Bignum(0);}else{for (int i=0;i<len;i++){if ((i+leng)<25)num[i]=num[i+leng];}for (int j=0;j<leng;j++){num[len-1-j]=0;}}len=len-leng;return *this;}*/Bignum& Bignum:: operator>>(int leng){if(len==1 ){len=(len+leng)>25? 25:(len+leng);num[len-1]=num[0];for (int i=0;i<=len-2;i++){num[i]=0;}return *this;}for (int i=len-1;i>=0;i--){if((i+leng)<25)num[i+leng]=num[i];}for(int j=0;j<leng;j++){num[j]=0;}len=(len+leng)>25? 25:(len+leng);/*if ((len+leng)<=25){for (int i=0;i<len;i++){num[i+leng]=num[i];}for (int j=0;j<leng;j++){num[j]=0;}len+=leng;}else{for (int i=0;i<25;i++){if ((i+leng)<25){num[i+leng]=num[i];}}for (int j=0;j<leng;j++){num[j]=0;}len=25;}*/return *this;}Bignum& Bignum:: operator=(const Bignum& B){memset(num,0,sizeof(num));len=B.len;for (int i=0;i<len;i++){num[i]=B.num[i];}return *this;}bool  Bignum:: operator>(const Bignum& A){int index=len>=A.len ? len:A.len;while((num[index-1]==A.num[index-1])&&index>0 ){index--;}if( num[index-1]>A.num[index-1] )return true;else return false;}bool Bignum:: operator==(const Bignum& A ){if (A.len==len){for (int i=0;i<len;i++){if (A.num[i]!=num[i]){return false;}}return true;}else return false;}Bignum:: Bignum(const int a){len=0; memset(this,0,sizeof(num));int c=a; int d=a;while(c>MAX){d=c- (c/(MAX+1))*(MAX+1);num[len++]=d;c=c/(MAX+1);}num[len++]=c;}/*Bignum:: Bignum(const char* a){int index,i,l,k,t;memset(num,0,sizeof(num)); l=strlen(a);len=l/4;if(l%4!=0)len++;index=0;for (i=l-1;i>=0;i-=4){t=0;k=i-4+1;if(k<0)k=0;for (int j=k ; k<=i ;j++){t+=t*10+a[j]-'0';}num[index++]=t;}}*/ istream& operator>>(istream& in, Bignum& b){char ch[100];int i;in>>ch;int l=strlen(ch);int count=0;int sum=0;for (i=l-1;i>=0;){sum=0;int t=1;for (int j=0;j<4&&i>=0;j++,i--,t*=10){sum+=(ch[i]-'0')*t;}b.num[count]=sum;count++;}b.len=count++;return in;} ostream& operator<<(ostream& os, Bignum& A){int i; os << A.num[A.len-1];   for (i=A.len-2;i>=0;i--){os.width(4);os.fill('0');os<<A.num[i];}return os;}  Bignum Bignum:: operator+(const Bignum& A){int big=A.len>=len? A.len:len;for (int i=0;i<big;i++){num[i]+=A.num[i];if(num[i]>MAX){num[i+1]+=1;  //index越大,位数越;num[i]-=MAX+1;}}if(num[big]!=0){len=big+1;}elselen=big;return *this;}Bignum Bignum:: operator-(const Bignum& A){/* 位数 符号*/int i,j,big;Bignum t1,t2;bool flag;if(*this>A){t1=*this;t2=A;flag=0;}else {t1=A;t2=*this;flag=1;}big=t1.len;for (i=0;i<big;i++){if (t1.num[i]<t2.num[i]){j=i+1;while(t1.num[j]==0)j++;t1.num[j--]--;while(j>i)t1.num[j--]=MAX;t1.num[i]+=MAX+1-t2.num[i];}else{t1.num[i]-=t2.num[i];}}while(t1.num[big-1]==0 && big >1)big--;t1.len=big;if(flag)t1.num[big-1]=0-t1.num[big-1];return t1;}Bignum Bignum:: operator* (const Bignum& A){int i,j;int temp;Bignum temp_;for (i=0;i<len;i++){int up=0;for (j=0;j<A.len;j++){temp=num[i]*A.num[j]+temp_.num[i+j]+up;if (temp>MAX){temp_.num[i+j]=temp-temp/(MAX+1)*(MAX+1);up=temp/(MAX+1);}else{temp_.num[i+j]=temp;up=0;}}if (up!=0)temp_.num[i+j]=up;}temp_.len=len+A.len;while(temp_.num[temp_.len-1]==0 && temp_.len > 1)temp_.len--;return temp_;}Bignum Bignum:: operator/ (const Bignum& A){Bignum temp1;Bignum temp2;Bignum temp3;Bignum quotient;Bignum remainder;temp1= *this;Bignum temp4;Bignum temp5;temp2=A;temp3=A;int ll=len-A.len;int i;if (temp1>temp2 && !(temp1==temp2)){temp2>>ll;if( temp1>temp2 || temp1==temp2 ) //计算位数;quotient.len=ll+1;elsequotient.len=ll;int lentemp=quotient.len-1;temp2=A;remainder=temp1;while(ll>=0){     temp2>>ll;//cout<<"移位"<<temp2;if( remainder>temp2 || remainder==temp2 ){for ( i=1;i<=10000;i++)  {temp4=remainder-Bignum(i)*temp2;//cout<<"迭代:"<<temp4<<"长度:"<<temp4.len<<endl;if(temp4 < Bignum(0) ){i--;break;}}remainder=remainder-Bignum(i)*temp2;//cout<<"余数"<<remainder<<endl;//cout<<"商数"<<i<<endl;quotient.num[lentemp--]=i;//cout<<"上"<<quotient<<endl;}temp2=temp3;ll--;}return quotient;}else if(temp1==temp2){return Bignum(1);}else {return Bignum(0);}}int main(){char s;Bignum A;Bignum B;Bignum C;cin>>A>>s>>B;switch(s){case'+':{C=A+B;}break;case'-':{C=A-B;}break;case'*':{C=A*B;}break;case'/':{C=A/B;}break;}cout<<C;return 0;}


0 0
原创粉丝点击