大数 加法,乘法,减法(c++类实现)

来源:互联网 发布:山狗运动相机 知乎 编辑:程序博客网 时间:2024/04/29 07:12

闲来无事,练练c++!(有待完善,还少除法)

#include <iostream>#include <string>#include <cstring>#include <cstdlib>#include <cmath>using namespace std;const int INF=1e4;class BignNum{public://--------------------构造函数BignNum(){ memset(num,0,sizeof(num)); len=1; }BignNum(int number){ *this=number; }BignNum(char *number){ *this=number; }//-------------------重载 "=" 运算符BignNum operator =(const char *number){len=strlen(number);for(int i=0;i<len;i++)num[i]=number[len-1-i]-'0';return *this;}BignNum operator =(int number){char temp[INF];sprintf(temp,"%d",number);*this=temp;return *this;}string str() const;   //将计算结果转换成字符串BignNum operator + (const BignNum& x)const;  //加法运算BignNum operator - (const BignNum& x)const;  //减法运算BignNum operator * (const BignNum& x)const;  //乘法运算private:int len;   //要计算的数据的长度int num[INF];  //保存要计算的数据};string BignNum::str()const{string res="";for(int i=0;i<len;i++)res=char(num[i]+'0')+res;if(res == "") res="0";else        //除去前导0{int i;for(i=0;i<len-1;i++)if(res[i]!='0') break;  res=res.substr(i,len-i);}return res;}BignNum BignNum::operator - (const BignNum& x)const{BignNum temp;temp.len=0;for(int i=0,g=0;i<len;i++){if(i>=x.len){temp.num[temp.len++]=num[i]-g;g=0;continue;}if(num[i]-g<x.num[i]){temp.num[temp.len++]=num[i]+10-x.num[i]-g;g=1;}else {temp.num[temp.len++]=num[i]-x.num[i]-g;g=0;}}return temp;}BignNum BignNum::operator + (const BignNum& x)const{BignNum temp;temp.len=0;for(int i=0,g=0;g||i<max(len,x.len);i++){int b=g;if(i<len) b+=num[i];if(i<x.len) b+=x.num[i];temp.num[temp.len++]=b%10;g=b/10;}return temp;}BignNum BignNum::operator * (const BignNum& x)const{BignNum temp;temp.len=len+x.len-1;for(int i=0;i<len ;i++){int g(0);for(int j=0;j<x.len;j++){temp.num[i+j]+=num[i]*x.num[j]+g;if(j!=x.len-1){g=temp.num[i+j]/10;temp.num[i+j]=temp.num[i+j]%10;}}}if(temp.num[temp.len-1]>9){int number=temp.num[temp.len-1]/10;temp.num[temp.len-1]=temp.num[temp.len-1]%10;temp.num[temp.len]=number;temp.len++;}return temp;}//----------重载 "<<" ">>" 运算符istream& operator >> (istream& in,BignNum& x){string s;in>>s;x=s.c_str();return in;}ostream& operator << (ostream& out,BignNum& x){out<<x.str()<<endl;return out;}int swap(char *str1,char *str2)    //比较相减的两个字符串的大小{int len1=strlen(str1);int len2=strlen(str2);if(len1<len2)return -1;else if(len1 == len2){if(strcmp(str1,str2)==0) return 0;if(strcmp(str1,str2)<0)return -1;}return 1;}int main(){int ncase;cin>>ncase;while(ncase--){char str1[500],str2[500];scanf("%s%s",str1,str2);int flag=swap(str1,str2);if(flag==0) cout<<"0"<<endl;else if(flag==-1){BignNum Instance1(str2),Instance2(str1),temp;temp=Instance1-Instance2;cout<<"Instance1-Instance2=-"<<temp<<endl;}else{BignNum Instance1(str1),Instance2(str2),temp;temp=Instance1-Instance2;cout<<"Instance1-Instance2="<<temp<<endl;}char str3[500],str4[500];          BignNum Instance3,Instance4,temp1;          cin>>Instance3>>Instance4;          temp1=Instance3+Instance4;          cout<<"Instance3+Instance4="<<temp1<<endl;            temp1=Instance3*Instance4;          cout<<"Instance3*Instance4="<<temp1<<endl;  }return 0;}