大数 加法,乘法,减法(c++类实现)
发布时间:2020-12-14 04:05:45 所属栏目:大数据 来源:网络整理
导读:闲来无事,练练c++!(有待完善,还少除法) #include iostream#include string#include cstring#include cstdlib#include cmathusing namespace std;const int INF=1e4;class BignNum{public://--------------------构造函数BignNum(){ memset(num,sizeof(num
闲来无事,练练c++!(有待完善,还少除法) #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; const int INF=1e4; class BignNum { public: //--------------------构造函数 BignNum(){ memset(num,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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |