ps:实现是实现了,但错误未知,甚用。
ps:代码有点臃肿,凑和用着。
ps:能用java就用java,其次手写,最后套用这个。
整数:
1.int数组
/* 整数大数 int数组实现 */ #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; #define MAXN 9999//万进制 #define DLEN 4//4位 class BigNum{ private: int a[500];//可以控制大数位数(500*4) int len;//大数长度 public: BigNum(){//构造函数 len=1; memset(a,0,sizeof(a)); } BigNum(const int);//将int转化为大数 BigNum(const char *);//将字符串转化为大数 BigNum(const BigNum &);//拷贝构造函数 BigNum &operator=(const BigNum &);//重载赋值运算符,大数之间赋值 BigNum operator+(const BigNum &)const;//大数+大数 BigNum operator-(const BigNum &)const;//大数-大数 BigNum operator*(const BigNum &)const;//大数*大数 BigNum operator/(const int &)const;//大数/int BigNum operator^(const int &)const;//幂运算 int operator%(const int &)const;//取模 bool operator>(const BigNum &)const;//大数与大数比较 bool operator>(const int &)const;//大数与int比较 void print();//输出大数 }; BigNum::BigNum(const int b){//将int转化为大数 int c,d=b; len=0; memset(a,0,sizeof(a)); while(d>MAXN){ //c=d-(d/(MAXN+1))*(MAXN+1); c=d%(MAXN+1);//取出后四位 d=d/(MAXN+1);// a[len++]=c; } a[len++]=d; } BigNum::BigNum(const char *s){//将字符串转化为大数 int t,k,index,l,i,j; memset(a,0,sizeof(a)); l=strlen(s); len=l/DLEN; if(l%DLEN)++len; index=0; for(i=l-1;i>=0;i-=DLEN){ t=0; k=i-DLEN+1; if(k<0)k=0; for(j=k;j<=i;++j) t=t*10+s[j]-'0'; a[index++]=t; } } BigNum::BigNum(const BigNum &T):len(T.len){//拷贝构造函数 int i; memset(a,0,sizeof(a)); for(i=0;i<len;++i) a[i]=T.a[i]; } BigNum &BigNum::operator=(const BigNum &n){//重载复制运算符,大数之间赋值 int i; len=n.len; memset(a,0,sizeof(a)); for(i=0;i<len;++i) a[i]=n.a[i]; return *this; } BigNum BigNum::operator+(const BigNum &T)const{//大数+大数 BigNum t(*this); int i,big;//位数 big=T.len>len?T.len:len; for(i=0;i<big;++i){ t.a[i]+=T.a[i]; if(t.a[i]>MAXN){ ++t.a[i+1]; t.a[i]-=MAXN+1; } } if(t.a[big]!=0)t.len=big+1; else t.len=big; return t; } BigNum BigNum::operator-(const BigNum &T)const{//大数-大数 int i,j,big; bool flag; BigNum t1,t2;//t1大的,t2小的 if(*this>T){ t1=*this; t2=T; flag=0;//前面的大 } else{ t1=T; t2=*this; flag=1;//前面的小 } big=t1.len; for(i=0;i<big;++i){ if(t1.a[i]<t2.a[i]){ j=i+1; while(t1.a[j]==0)++j; --t1.a[j--]; while(j>i)t1.a[j--]+=MAXN; t1.a[i]+=MAXN+1-t2.a[i]; } else t1.a[i]-=t2.a[i]; } while(t1.a[t1.len-1]==0&&t1.len>1){ --t1.len; --big; } if(flag)t1.a[big-1]=-t1.a[big-1];//前面的小,结果为负 return t1; } BigNum BigNum::operator*(const BigNum &T)const{//大数*大数 BigNum ret; int i,j,up; int temp,temp1; for(i=0;i<len;++i){ up=0; for(j=0;j<T.len;++j){ temp=a[i]*T.a[j]+ret.a[i+j]+up; if(temp>MAXN){ //temp1=temp-temp/(MAXN+1)*(MAXN+1); temp1=temp%(MAXN+1); up=temp/(MAXN+1); ret.a[i+j]=temp1; } else{ up=0; ret.a[i+j]=temp; } } if(up!=0)ret.a[i+j]=up; } ret.len=i+j; while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len; return ret; } BigNum BigNum::operator/(const int &b)const{//大数/int BigNum ret; int i,down=0; for(i=len-1;i>=0;--i){ ret.a[i]=(a[i]+down*(MAXN+1))/b; down=a[i]+down*(MAXN+1)-ret.a[i]*b; } ret.len=len; while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len; return ret; } BigNum BigNum::operator^(const int &n)const{//幂运算 BigNum t,ret(1); int i; if(n<0)exit(-1); if(n==0)return 1; if(n==1)return *this; int m=n; while(m>1){ t=*this; for(i=1;i<<1<=m;i<<=1){ t=t*t; } m-=i; ret=ret*t; if(m==1)ret=ret*(*this); } return ret; } int BigNum::operator%(const int &b)const{//取模 int i,d=0; for(i=len-1;i>=0;--i){ d=((d*(MAXN+1))%b+a[i])%b; } return d; } bool BigNum::operator>(const BigNum &T)const{//大数与大数比较 int ln; if(len>T.len)return true; else if(len==T.len){ 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{//大数与int比较 BigNum b(t); return *this>b; } void BigNum::print(){//输出大数 int i; printf("%d",a[len-1]); for(i=len-2;i>=0;--i){ printf("%.4d",a[i]);//%.4d代表4位,不够前面补0 } printf(" "); } int main(){ char str1[]="2",str2[]="22222222222222222222222222222222222222222222"; int c=2; //scanf("%s%s",str1,str2); BigNum a,b,t; a=BigNum(str1); b=BigNum(str2); printf("a=");a.print(); printf("b=");b.print(); printf("c=%d ",c); printf(" "); t=a+b; printf("a+b=");t.print(); t=a-b; printf("a-b=");t.print(); t=a*b; printf("a*b=");t.print(); t=a/c; printf("a/c=");t.print(); printf(" "); t=a^c; printf("a^c=");t.print(); t=a%c; printf("a%%c=");t.print(); a>b?printf("a>b "):printf("a<=b "); a>c?printf("a>c "):printf("a<=c "); return 0; }
2.char数组
/* 整数大数 char数组实现 */ #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; #define MAXN 9 #define DLEN 1 class BigNum{ private: char a[1024]; int len; public: BigNum(){ len=1; memset(a,0,sizeof(a)); } BigNum(const int); BigNum(const char *); BigNum(const BigNum &); BigNum &operator=(const 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){ memset(a,0,sizeof(a)); len=0; int d=b; while(d>MAXN){ a[len++]=d%10; d=d/10; } a[len++]=d; } BigNum::BigNum(const char *s){ memset(a,0,sizeof(a)); len=strlen(s); int i,k=0; for(i=len-1;i>=0;--i) a[k++]=s[i]-'0'; } BigNum::BigNum(const BigNum &T){ memset(a,0,sizeof(a)); len=T.len; int i; for(i=0;i<len;++i) a[i]=T.a[i]; } BigNum &BigNum::operator=(const BigNum &n){ memset(a,0,sizeof(a)); len=n.len; int i; for(i=0;i<len;++i) a[i]=n.a[i]; return *this; } BigNum BigNum::operator+(const BigNum &T)const{ BigNum t(*this); int i,big; big=T.len>len?T.len:len; for(i=0;i<big;++i){ t.a[i]+=T.a[i]; if(t.a[i]>MAXN){ ++t.a[i+1]; t.a[i]-=MAXN+1; } } if(t.a[big]!=0)t.len=big+1; else t.len=big; return t; } BigNum BigNum::operator-(const BigNum &T)const{ int i,j,big; bool flag; BigNum t1,t2; if(*this>T){ t1=*this; t2=T; flag=0; } else{ t1=T; t2=*this; flag=1; } big=t1.len; for(i=0;i<big;++i){ if(t1.a[i]<t2.a[i]){ j=i+1; while(t1.a[j]==0)++j; --t1.a[j--]; while(j>i)t1.a[j--]+=MAXN; t1.a[i]+=MAXN+1-t2.a[i]; } else t1.a[i]-=t2.a[i]; } while(t1.a[t1.len-1]==0&&t1.len>1){ --t1.len; --big; } if(flag)t1.a[big-1]=-t1.a[big-1]; return t1; } BigNum BigNum::operator*(const BigNum &T)const{ BigNum ret; int i,j,up; int temp,temp1; for(i=0;i<len;++i){ up=0; for(j=0;j<T.len;++j){ temp=a[i]*T.a[j]+ret.a[i+j]+up; if(temp>MAXN){ temp1=temp%(MAXN+1); up=temp/(MAXN+1); ret.a[i+j]=temp1; } else{ up=0; ret.a[i+j]=temp; } } if(up!=0)ret.a[i+j]=up; } ret.len=i+j; while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len; return ret; } BigNum BigNum::operator/(const int &b)const{ BigNum ret; int i,down=0; for(i=len-1;i>=0;--i){ ret.a[i]=(a[i]+down*(MAXN+1))/b; down=a[i]+down*(MAXN+1)-ret.a[i]*b; } ret.len=len; while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len; return ret; } BigNum BigNum::operator^(const int &n)const{ BigNum t,ret(1); int i; if(n<0)exit(-1); if(n==0)return 1; if(n==1)return *this; int m=n; while(m>1){ t=*this; for(i=1;i<<1<=m;i<<=1){ t=t*t; } m-=i; ret=ret*t; if(m==1)ret=ret*(*this); } return ret; } int BigNum::operator%(const int &b)const{ int i,d=0; for(i=len-1;i>=0;--i){ d=((d*(MAXN+1))%b+a[i])%b; } return d; } bool BigNum::operator>(const BigNum &T)const{ int ln; if(len>T.len)return true; else if(len==T.len){ 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 i; for(i=len-1;i>=0;--i) printf("%d",a[i]); printf(" "); } int main(){ char str1[]="2",str2[]="22222222222222222222222222222222222222222222"; int c=2; //scanf("%s%s",str1,str2); BigNum a,b,t; a=BigNum(str1); b=BigNum(str2); printf("a=");a.print(); printf("b=");b.print(); printf("c=%d ",c); printf(" "); t=a+b; printf("a+b=");t.print(); t=a-b; printf("a-b=");t.print(); t=a*b; printf("a*b=");t.print(); t=a/c; printf("a/c=");t.print(); printf(" "); t=a^c; printf("a^c=");t.print(); t=a%c; printf("a%%c=");t.print(); a>b?printf("a>b "):printf("a<=b "); a>c?printf("a>c "):printf("a<=c "); return 0; }
网上的一个原版:
/* 整数大数 int数组实现 */ #include<iostream> #include<stdio.h> #include<string> #include<string.h> #include<iomanip> #include<algorithm> using namespace std; #define MAXN 9999//万进制 #define MAXSIZE 10//用于cin输入时,大数长度为 MAXSIZE*4 #define DLEN 4//4位 class BigNum { private: int a[500]; //可以控制大数的位数 int len; //大数长度 public: BigNum() { len = 1; //构造函数 memset(a,0,sizeof(a)); } BigNum(const int); //将一个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; //大数的n次方运算 int operator%(const int &) const; //大数对一个int类型的变量进行取模运算 bool operator>(const BigNum & T)const; //大数和另一个大数的大小比较 bool operator>(const int & t)const; //大数和一个int类型的变量的大小比较 void print(); //输出大数 }; BigNum::BigNum(const int b) //将一个int类型的变量转化为大数 { int c,d = b; len = 0; memset(a,0,sizeof(a)); while(d > MAXN) { c = d - (d / (MAXN + 1)) * (MAXN + 1); d = d / (MAXN + 1); a[len++] = c; } a[len++] = d; } BigNum::BigNum(const char*s) //将一个字符串类型的变量转化为大数 { int t,k,index,l,i; memset(a,0,sizeof(a)); l=strlen(s); len=l/DLEN; if(l%DLEN) len++; index=0; for(i=l-1; i>=0; i-=DLEN) { t=0; k=i-DLEN+1; if(k<0) k=0; for(int j=k; j<=i; j++) t=t*10+s[j]-'0'; a[index++]=t; } } BigNum::BigNum(const BigNum & T) : len(T.len) //拷贝构造函数 { int i; memset(a,0,sizeof(a)); for(i = 0 ; i < len ; i++) a[i] = T.a[i]; } BigNum & BigNum::operator=(const BigNum & n) //重载赋值运算符,大数之间进行赋值运算 { int i; len = n.len; memset(a,0,sizeof(a)); for(i = 0 ; i < len ; i++) a[i] = n.a[i]; return *this; } istream& operator>>(istream & in, BigNum & b) //重载输入运算符 { char ch[MAXSIZE*4]; int i = -1; in>>ch; int l=strlen(ch); int count=0,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.a[count]=sum; count++; } b.len =count++; return in; } ostream& operator<<(ostream& out, BigNum& b) //重载输出运算符 { int i; cout << b.a[b.len - 1]; for(i = b.len - 2 ; i >= 0 ; i--) { cout.width(DLEN); cout.fill('0'); cout << b.a[i]; } return out; } BigNum BigNum::operator+(const BigNum & T) const //两个大数之间的相加运算 { BigNum t(*this); int i,big; //位数 big = T.len > len ? T.len : len; for(i = 0 ; i < big ; i++) { t.a[i] +=T.a[i]; if(t.a[i] > MAXN) { t.a[i + 1]++; t.a[i] -=MAXN+1; } } if(t.a[big] != 0) t.len = big + 1; else t.len = big; return t; } BigNum BigNum::operator-(const BigNum & T) const //两个大数之间的相减运算 { int i,j,big; bool flag; BigNum t1,t2; if(*this>T) { t1=*this; t2=T; flag=0; } else { t1=T; t2=*this; flag=1; } big=t1.len; for(i = 0 ; i < big ; i++) { if(t1.a[i] < t2.a[i]) { j = i + 1; while(t1.a[j] == 0) j++; t1.a[j--]--; while(j > i) t1.a[j--] += MAXN; t1.a[i] += MAXN + 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--; big--; } if(flag) t1.a[big-1]=0-t1.a[big-1]; return t1; } BigNum BigNum::operator*(const BigNum & T) const //两个大数之间的相乘运算 { BigNum ret; int i,j,up; int temp,temp1; for(i = 0 ; i < len ; i++) { up = 0; for(j = 0 ; j < T.len ; j++) { temp = a[i] * T.a[j] + ret.a[i + j] + up; if(temp > MAXN) { temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); up = temp / (MAXN + 1); ret.a[i + j] = temp1; } else { up = 0; ret.a[i + j] = temp; } } if(up != 0) ret.a[i + j] = up; } ret.len = i + j; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; } BigNum BigNum::operator/(const int & b) const //大数对一个整数进行相除运算 { BigNum ret; int i,down = 0; for(i = len - 1 ; i >= 0 ; i--) { ret.a[i] = (a[i] + down * (MAXN + 1)) / b; down = a[i] + down * (MAXN + 1) - ret.a[i] * b; } ret.len = len; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; } int BigNum::operator %(const int & b) const //大数对一个int类型的变量进行取模运算 { int i,d=0; for (i = len-1; i>=0; i--) { d = ((d * (MAXN+1))% b + a[i])% b; } return d; } BigNum BigNum::operator^(const int & n) const //大数的n次方运算 { BigNum t,ret(1); int i; if(n<0) exit(-1); if(n==0) return 1; if(n==1) return *this; int m=n; while(m>1) { t=*this; for( i=1; i<<1<=m; i<<=1) { t=t*t; } m-=i; ret=ret*t; if(m==1) ret=ret*(*this); } return ret; } bool BigNum::operator>(const BigNum & T) const //大数和另一个大数的大小比较 { int ln; if(len > T.len) return true; else if(len == T.len) { 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 //大数和一个int类型的变量的大小比较 { BigNum b(t); return *this>b; } void BigNum::print() //输出大数 { int i; cout << a[len - 1]; for(i = len - 2 ; i >= 0 ; i--) { cout.width(DLEN); cout.fill('0'); cout << a[i]; } cout << endl; } int main() { char str[100]; BigNum a; scanf("%s",str); a=BigNum(str); a.print(); return 0; }
小数:
这里只写了个小数加法,代码臃肿,先将就着用。。
/* 小数大数,加法 char数组实现 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std; void plu(char *a,char *b){//注意存储方式:整数倒着存,小数正着存,看代码需注意 int i,j,k,lena,lenb,lena1,lena2,lenb1,lenb2,lenc1,lenc2;//len分别对应相应数组的长度 char a1[1024],a2[1024],b1[1024],b2[1024],c1[1024],c2[1024];//a1、a2为第一个数的整数部分、小数部分 lena=strlen(a);//b1、b2为第二个数;c1、c2为结果 lenb=strlen(b); //取出第1个数的整数部分、小数部分 for(i=0;i<lena;++i) if(a[i]=='.') break; lena1=i; lena2=lena-i-1; for(j=i-1,k=0;j>=0;--j) a1[k++]=a[j]; for(j=i+1,k=0;j<lena;++j) a2[k++]=a[j]; //取出第2个数的整数部分、小数部分 for(i=0;i<lenb;++i) if(b[i]=='.') break; lenb1=i; lenb2=lenb-i-1; for(j=i-1,k=0;j>=0;--j) b1[k++]=b[j]; for(j=i+1,k=0;j<lenb;++j) b2[k++]=b[j]; //开始计算 int up=0;//进位 //计算小数部分 if(lena2>lenb2){ lenc2=lena2; for(i=lena2-1;i>=lenb2;--i) c2[i]=a2[i]; for(;i>=0;--i){ c2[i]=a2[i]+b2[i]-'0'+up; if(c2[i]>'9'){ up=1; c2[i]-=10; } else up=0; } } else{ lenc2=lenb2; for(i=lenb2-1;i>=lena2;--i) c2[i]=b2[i]; for(;i>=0;--i){ c2[i]=a2[i]+b2[i]-'0'+up; if(c2[i]>'9'){ up=1; c2[i]-=10; } else up=0; } } while(c2[lenc2-1]=='0'&&lenc2>=1)--lenc2;//去除后面多余的0 //计算整数部分 if(lena1>lenb1){ lenc1=lena1; for(i=0;i<lenb1;++i){ c1[i]=a1[i]+b1[i]-'0'+up; if(c1[i]>'9'){ up=1; c1[i]-=10; } else up=0; } for(;i<lena1;++i){ c1[i]=a1[i]+up; if(c1[i]>'9'){ up=1; c1[i]-=10; } else up=0; } } else{ lenc1=lenb1; for(i=0;i<lena1;++i){ c1[i]=a1[i]+b1[i]-'0'+up; if(c1[i]>'9'){ up=1; c1[i]-=10; } else up=0; } for(;i<lenb1;++i){ c1[i]=b1[i]+up; if(c1[i]>'9'){ up=1; c1[i]-=10; } else up=0; } } if(up==1)printf("1");//最后有进位 for(i=lenc1-1;i>=0;--i) printf("%c",c1[i]); if(lenc2>0){ printf("."); for(i=0;i<lenc2;++i) printf("%c",c2[i]); } printf(" "); } int main(){ char a[1024],b[1024]; while(~scanf("%s%s",a,b)) plu(a,b); return 0; }