应用中需要解决大数运算问题,请设计无符号大数类,能支持+,-,*,比较运算和输出,假定本题大数在200位以内,输入数据均合法。
代码:
#include <iostream>
#include <string.h>#include <stdio.h>
#include <stdlib.h>
using namespace std;
class daShu{
private:
int shu[200];
int lens;
public:
daShu(){
lens=0;
for(int i=0;i<200;i++)shu[i]=0;
}
void show()const{/*展示大数*/
for(int i=0;i<lens;i++){
cout<<shu[i];
}
cout<<endl;
}
int getsize(){return lens;}
void intsert(int i,int e);
daShu& operator=(const daShu &a);
friend daShu operator+(const daShu &a,const daShu &b);/*重载运算符*/
friend daShu operator-(const daShu &a,const daShu &b);
friend daShu operator*(const daShu &a,const daShu &b);
};
void daShu::intsert(int i,int e){
shu[i] = e;
lens++;
}
daShu& daShu::operator=(const daShu &a){
if(this!=&a){
for(int i=0;i<lens;i++)shu[i]=0;
for(int i=0;i<a.lens;i++)shu[i]=a.shu[i];
lens=a.lens;
}
return *this;
}
daShu operator+(const daShu &a,const daShu &b){
daShu temp;
int x=0,y=0;/*记录十位,个位*/
int add=0;/*记录临时和*/
if(&b!=&a){
int i=0,j=0;
for(i=a.lens-1,j=b.lens-1;j>=0;i--,j--){
add = a.shu[i]+b.shu[j]+y;
x=add%10;//个位
temp.shu[i]=x;
add=add/10;
y=add%10;//十位
}
while(i>=0){
add = a.shu[i]+y;
x=add%10;
temp.shu[i]=x;
//cout<<temp.shu[i];
add=add/10;
y=add%10;
i--;
}
temp.lens=a.lens;
if(y!=0){
for(int i=temp.lens;i>0;i--)temp.shu[i]=temp.shu[i-1];
temp.shu[0]=y;
temp.lens+=1;
}
}
return temp;
}
daShu operator-(const daShu &a,const daShu &b){
daShu temp;
if(&a!=&b){
int i=0,j=0,k=0;
for(i=0;i<a.lens;i++)temp.shu[i] = a.shu[i];
for(i=a.lens-1,j=b.lens-1;j>=0;j--,i--){
if(temp.shu[i]<b.shu[j]){
temp.shu[i] = temp.shu[i]+10-b.shu[j];
for(k=1;temp.shu[i-k]==0;k++){
temp.shu[i-k]=9;
}
temp.shu[i-k]--;
}else{
temp.shu[i] = temp.shu[i]-b.shu[j];
}
}
temp.lens = a.lens;
if(temp.shu[0]==0){
for(int m=0;m<temp.lens;m++)temp.shu[m]=temp.shu[m+1];
temp.lens--;
}
}
return temp;
}
daShu operator*(const daShu &a,const daShu &b){
daShu temp;
temp.lens=a.lens+b.lens;
if(&a!=&b){
int i=0,j=0,k=temp.lens-1;//k控制累加移动
for(j=b.lens-1;j>=0;j--,k--){
int m=k;
int x=0,y=0;/*记录十位,个位*/
int add=0;/*记录临时积*/
for(i=a.lens-1;i>=0;i--,m--){//m控制移动
add = b.shu[j]*a.shu[i]+temp.shu[m]+y;
x=add%10;//个位
temp.shu[m]=x;
add=add/10;
y=add%10;//十位
}
if(y!=0)temp.shu[m]=y;
}
while(temp.shu[0]==0){
for(i=0;i<temp.lens;i++)temp.shu[i]=temp.shu[i+1];
temp.lens--;
}
}
return temp;
}
int main()
{
daShu a,b,c,d,e;
char x[200],y[200];
cin.getline(x,200);
cin.getline(y,200);
for(size_t i=0;i<strlen(x);i++){
char temp[2];
temp[0] = x[i];
temp[1] = '\0';
a.intsert(i,atoi(temp));
}
for(size_t i=0;i<strlen(y);i++){
char temp[2];
temp[0] = y[i];
temp[1] = '\0';
b.intsert(i,atoi(temp));
}
c=a+b;
d=a-b;
e=a*b;
c.show();
d.show();
e.show();
return 0;
}