设计一个大整数BigInt,重载整数的所有算数运算和关系运算,设计一个运用实例

lzp2680332 2012-06-02 03:07:15
求大神帮忙写下 只要实现四则运算就行了
...全文
392 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
W170532934 2012-06-02
  • 打赏
  • 举报
回复

#include"bigInt.h"

int main()
{
system("color 1e");
string str1,str2;
cout<<"请输入第一个大数(不超过40位):"<<endl;
cin>>str1;
cout<<"请输入第二个大数(不超过40位):"<<endl;
cin>>str2;
/*if(str1.size()>40||str2.size()>40)
{
cout<<" 您输入的大数超过40位!"<<endl;
exit(1);
}*/
bigInt b1(str1);
bigInt b2(str2);
bigInt b3;
cout<<"其和为: "<<endl;
cout<<" "<<b1+b2;
cout<<"其差为:"<<endl;
cout<<" "<<b1-b2;
cout<<"其积为:"<<endl;
cout<<" "<<b1*b2;
b3=b1/b2;
cout<<"其商为:"<<endl;
cout<<" "<<b3;
cout<<"余数为:"<<endl;
cout<<" "<<b1%b2;
}
W170532934 2012-06-02
  • 打赏
  • 举报
回复

bigInt::bigInt(unsigned int len)
{
length=len;
while(len--)
num.push_back(0);
Flag=true;
}
bigInt::bigInt(string str)
{
Flag=true;
length=str.size();
unsigned int len=length;
while(len)
{
string strtemp=str.substr(len-1,1);
const char* chartemp=strtemp.c_str();
if(len==1)//判断大数是否为负数
{
if(strcmp(chartemp,"-")==0)
{
Flag=false;
length--;
}
else
{
if(strcmp(chartemp,"0")<0||strcmp(chartemp,"9")>0)
{
cout<<" 您输入的大数不正确!"<<endl;
exit(1);
}
num.push_back(atoi(chartemp));
}
len--;
}
else{
if(strcmp(chartemp,"0")<0||strcmp(chartemp,"9")>0)
{
cout<<" 您输入的大数不正确!"<<endl;
exit(1);
}
num.push_back(atoi(chartemp));
len--;
}
}
(*this).delZeroFront();
}

bool operator >(const bigInt& lInt,const bigInt& rInt)//重载>运算符
{
bool flag=false;
if(lInt.length>rInt.length)
flag=true;
if(lInt.length==rInt.length)
{
unsigned int len=lInt.length;
while(len--)
{
if(lInt.num[len]>rInt.num[len])
{
flag=true;
break;
}
if(lInt.num[len]<rInt.num[len])
break;
}
}
return flag;
}
bool operator >(const bigInt& lInt,const string& str)
{
bigInt temp(str);
return(lInt>temp);
}


bool operator <(const bigInt& lInt,const bigInt& rInt)
{
bool flag=false;
if(lInt.length<rInt.length)
{
flag=true;
}
if(lInt.length==rInt.length)
{
unsigned int len=lInt.length;
while(len--)
{
if(lInt.num[len]<rInt.num[len])
{
flag=true;
break;
}
if(lInt.num[len]>rInt.num[len])
break;
}
}
return flag;
}
bool operator <(const bigInt& lInt,const string& str)
{
bigInt temp(str);
return(lInt<temp);
}

bool operator <=(const bigInt& lInt,const bigInt& rInt)
{
bool flag=false;
if(lInt.length<rInt.length)
{
flag=true;
}
if(lInt.length==rInt.length)
{
unsigned int len=lInt.length;
while(len--)
{
if(lInt.num[len]<=rInt.num[len])
{
flag=true;
break;
}
if(lInt.num[len]>rInt.num[len])
break;
}
}
return flag;
}

bool operator ==(const bigInt& lInt,const bigInt& rInt)
{
bool flag=true;
if(lInt.length!=rInt.length)
{
flag=false;
}
else{
unsigned int len=lInt.length;
while(len--)
{
if(lInt.num[len]!=rInt.num[len])
{
flag=false;
break;
}
}
}
return flag;
}
bool operator ==(const bigInt& lInt,const string& str)
{
bigInt temp(str);
return(lInt==temp);
}

//***********************输入输出运算符的重载****************
istream& operator >>(istream& in,bigInt& bInt)
{
string str;
cout<<"请输入一个大数:"<<endl;
in>>str;
bInt=str;
return in;
}
ostream& operator <<(ostream& out,bigInt& bInt)//重载输出运算符
{
bigInt temp=bInt;
temp.delZeroFront();
unsigned int len=temp.length;
if(temp.Flag==false)
cout<<"-";
while(len--)
{
out<<temp.num[len];
}
out<<endl;
return out;
}

void bigInt::addZeroFront(unsigned int len)//前面补零
{
while(len--)
{
num.push_back(0);
length++;
}
}
void bigInt::addZeroTail(unsigned int len)//大数后面补零
{
for(unsigned int i=0;i<len;i++)
num.push_back(0);
for(unsigned int i=length+len-1;i>len-1;i--)
num[i]=num[i-len];
for(unsigned int i=0;i<len;i++)
num[i]=0;
length+=len;
}

void bigInt::delZeroFront()
{
if(length>1)
{
for(unsigned int len=length;len>1;len--)
{
if(num[len-1]==0)
{
num.erase(num.end()-1);
length--;
}
else
break;
}
}
}

bigInt operator +(const bigInt& lInt,const bigInt& rInt)
{
bigInt lIntTmp=lInt;
bigInt rIntTmp=rInt;
if(lIntTmp.Flag==true&&rIntTmp.Flag==false)//左操作数为正,右操作数为负
{
rIntTmp.Flag=true;
return(lIntTmp-rIntTmp);
}
if(lIntTmp.Flag==false&&rIntTmp.Flag==true)//左操作数为负,右操作数为正
{
lIntTmp.Flag=true;
return(rIntTmp-lIntTmp);
}
unsigned int llen=lIntTmp.length;
unsigned int rlen=rIntTmp.length;
unsigned int count=0;//需要进行加法的次数
int carry=0;//进位
if(llen>rlen)
{
bigInt sumTmp(llen);
if(lIntTmp.Flag==true&&rIntTmp.Flag==true)//左右操作数都为正
sumTmp.Flag=true;
if(lIntTmp.Flag==false&&rIntTmp.Flag==false)//左右操作数都为负
sumTmp.Flag=false;
rIntTmp.addZeroFront(llen-rlen);//右操作数前面补齐零,方便计算
while(count<llen)
{
int carrysum=lIntTmp.num[count]+rIntTmp.num[count]+carry;
sumTmp.num[count]=carrysum%10;
carry=carrysum/10;
count++;
}
if(carry>0)
{
sumTmp.num.push_back(carry);
sumTmp.length++;
}
if(sumTmp=="0")
sumTmp.Flag=true;
return sumTmp;
}
else{
bigInt sumTmp(rlen);
if(lIntTmp.Flag==true&&rIntTmp.Flag==true)//左右操作数都为正
sumTmp.Flag=true;
if(lIntTmp.Flag==false&&rIntTmp.Flag==false)//左右操作数都为负
sumTmp.Flag=false;
lIntTmp.addZeroFront(rlen-llen);//右操作数前面补齐零,方便计算
while(count<rlen)
{
int carrysum=lIntTmp.num[count]+rIntTmp.num[count]+carry;
sumTmp.num[count]=carrysum%10;
carry=carrysum/10;
count++;
}
if(carry>0)
{
sumTmp.num.push_back(carry);
sumTmp.length++;
}
if(sumTmp=="0")
sumTmp.Flag=true;
return sumTmp;
}
}
bigInt operator +(const bigInt& lInt,const string& str)
{
bigInt temp(str);
return(lInt+temp);
}

bigInt operator -(const bigInt& lInt,const bigInt& rInt)
{
bigInt lIntTmp=lInt;
bigInt rIntTmp=rInt;
if(lIntTmp.Flag==true&&rIntTmp.Flag==false)//左操作数为正,右操作数为负
{
rIntTmp.Flag=true;
return(lIntTmp+rIntTmp);
}
if(lIntTmp.Flag==false&&rIntTmp.Flag==true)//左操作数为负,右操作数为正
{
rIntTmp.Flag=false;
return(lIntTmp+rIntTmp);
}
if(lIntTmp.Flag==false&&rIntTmp.Flag==false)//左右操作数都为负
{
lIntTmp.Flag=true;
rIntTmp.Flag=true;
return(rIntTmp-lIntTmp);
}
else{
if(lInt<rInt)
{
bigInt subTmp;
subTmp=rInt-lInt;
subTmp.Flag=false;
return subTmp;
}
bigInt subTmp(lInt.length);
rIntTmp.addZeroFront(lInt.length-rInt.length);
unsigned int count=0;//减法次数
while(count<lInt.length)
{
subTmp.num[count]=lIntTmp.num[count]-rIntTmp.num[count];
if(subTmp.num[count]<0)
{
subTmp.num[count]+=10;
lIntTmp.num[count+1]--;
}
count++;
}
subTmp.delZeroFront();
if(subTmp=="0")
subTmp.Flag=true;
return subTmp;
}
}
bigInt operator -(const bigInt& lInt,const string& str)
{
bigInt temp(str);
return(lInt-temp);
}

bigInt operator *(const bigInt& lInt,const bigInt& rInt)
{
bigInt lIntTmp=lInt;
bigInt rIntTmp=rInt;
unsigned int len=lInt.length+rInt.length;
bigInt ansTmp(len);
if(lInt.length<rInt.length)
{
lIntTmp=rInt;
rIntTmp=lInt;
}
lIntTmp.Flag=true;
rIntTmp.Flag=true;
for(unsigned int count=0;count<rIntTmp.length;count++)
{
bigInt temp(lIntTmp.length);
for(unsigned int i=0;i<lIntTmp.length;i++)
{
temp.num[i]=lIntTmp.num[i]*rIntTmp.num[count];
}
temp.addZeroTail(count);
ansTmp=ansTmp+temp;
}
if((lInt.Flag==false&&rInt.Flag==true)||(lInt.Flag==true&&rInt.Flag==false))//左右操作数不同号
ansTmp.Flag=false;
else{
ansTmp.Flag=true;
}
ansTmp.delZeroFront();
if(ansTmp=="0")
ansTmp.Flag=true;
return ansTmp;
}

bigInt operator /(const bigInt& lInt,const bigInt& rInt)
{
bigInt temp("0");
if(lInt=="0"&&rInt.num[0]!=0)
return temp;
if(rInt==temp)
{
cout<<" 除数不能为0,您输入的除数不正确!"<<endl;
exit(1);
}
if(lInt<rInt)
{
if(lInt.Flag==false&&rInt.Flag==true)//左操作数为负,右操作数为正
{
temp.num.erase(temp.num.end()-1);
temp.num.push_back(1);
temp.length=1;
temp.Flag=false;
return(temp);
}
if(lInt.Flag==false&&rInt.Flag==false)//左右操作数都为负
{
temp.num.erase(temp.num.end()-1);
temp.num.push_back(1);
temp.length=1;
temp.Flag=true;
return(temp);
}
temp.num.erase(temp.num.end()-1);
temp.num.push_back(0);
temp.length=1;
}
else if(lInt==rInt)
{
temp.num.erase(temp.num.end()-1);
temp.num.push_back(1);
temp.length=1;
if((lInt.Flag==false&&rInt.Flag==true)||(lInt.Flag==true&&rInt.Flag==false))//左右操作数不同号
temp.Flag=false;
}
else
{
unsigned int len=lInt.length-rInt.length+1;
bigInt lIntTmp=lInt;
bigInt rIntTmp=rInt;
bigInt otmp(len);
/*while(rIntTmp*otmp<lIntTmp)//这种方法时间复杂度太大,不可行
//otmp=otmp+"1";
otmp.num[0]++;
if(rIntTmp*otmp==lIntTmp)
temp=otmp+temp;
else
if(otmp>"1")
{
otmp=otmp-"1";
temp=otmp+temp;
}*/
lIntTmp.Flag=true;
rIntTmp.Flag=true;
while(len--)
{
while(rIntTmp*otmp<lIntTmp)
otmp.num[len]++;
if(rIntTmp*otmp==lIntTmp)
{
temp=temp+otmp;
break;
}
else{
if(otmp.num[len]>0)
otmp.num[len]--;
temp=temp+otmp;
lIntTmp=lIntTmp-rIntTmp*otmp;
otmp.num.erase(otmp.num.end()-1);
otmp.length--;
}
}
if((lInt.Flag==false&&rInt.Flag==true||lInt.Flag==false&&rInt.Flag==false)&&rIntTmp*otmp==lIntTmp)//左为负右为正或者左右都为负
temp=temp-"1";
if(lInt.Flag==false&&rInt.Flag==true||lInt.Flag==false&&rInt.Flag==false)//左为负右为正或者左右都为负
temp=temp+"1";
}
temp.delZeroFront();
if((lInt.Flag==false&&rInt.Flag==true)||(lInt.Flag==true&&rInt.Flag==false))//左右操作数不同号
temp.Flag=false;
if(temp=="0")
temp.Flag=true;
return temp;
}

//********************************************************
//**************重载%运算符*******************************
bigInt operator %(const bigInt& lInt,const bigInt& rInt)
{
bigInt temp=rInt*(lInt/rInt);
temp.Flag=true;
bigInt lIntTmp=lInt;
lIntTmp.Flag=true;
bigInt mod=lIntTmp-temp;
if(mod.Flag==false)
mod.Flag=true;
return mod;
}
实现
無_1024 2012-06-02
  • 打赏
  • 举报
回复
百度 很多
W170532934 2012-06-02
  • 打赏
  • 举报
回复

#ifndef BIGINT_H
#define BIGINT_H

#include<vector>
#include<string>
#include<iostream>
using namespace std;

class bigInt
{
public:
bigInt(){Flag=true;}
bigInt(unsigned int len);//大数长度为len,值为0
bigInt(string str);//大数为string
~bigInt(){}
/*重载比较运算符*/
friend bool operator >(const bigInt& lInt,const bigInt& rInt);
friend bool operator >(const bigInt& lInt,const string& str);
friend bool operator <(const bigInt& lInt,const bigInt& rInt);
friend bool operator <(const bigInt& lInt,const string& str);
friend bool operator <=(const bigInt& lInt,const bigInt& rInt);
friend bool operator ==(const bigInt& lInt,const bigInt& rInt);
friend bool operator ==(const bigInt& lInt,const string& str);
/*重载输入输出运算符*/
friend istream& operator >>(istream& in,bigInt& bInt);
friend ostream& operator <<(ostream& out,bigInt& bInt);
/*重载+ - * /%运算符*/
friend bigInt operator +(const bigInt& lInt,const bigInt &rInt);
friend bigInt operator +(const bigInt& lInt,const string& str);
friend bigInt operator -(const bigInt& lInt,const bigInt &rInt);
friend bigInt operator -(const bigInt& lInt,const string& str);
friend bigInt operator *(const bigInt& lInt,const bigInt &rInt);
friend bigInt operator /(const bigInt& lInt,const bigInt &rInt);
friend bigInt operator %(const bigInt& lInt,const bigInt& rInt);
//bool Flag;//判断减法结果是否为负,TRUE表示结果为正
private:
vector<int> num;//存放大数类
unsigned int length;//大数类的长度
bool Flag;//保存大数的符号
void delZeroFront();//去掉大数中前面的0,如果全为零则保留一个0
void addZeroFront(unsigned int len);//大数前面补零
void addZeroTail(unsigned int len);//大数后面补零
};

#endif

头文件

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧