闲来无事,练练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;
}