LOW-END 版:
#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>
using namespace std;
const int MAX=9999;
class Bignum{
private:
int num[50];
int len;
public:
bool operator<(const Bignum& A){
if(*this>A || *this==A)
return false;
else return true;
}
void getlen( ){
cout<<"长度为" <<len<<endl;
}
Bignum(){len=0; memset(num,0,sizeof(num));}
Bignum(const Bignum& b){
len=b.len;
for (int i=0;i<len;i++)
{
num[i]=b.num[i];
}
}
bool operator>(const Bignum& );
bool operator==(const Bignum&);
friend istream& operator>>(istream& in,Bignum&);
friend ostream& operator<<(ostream& os,Bignum&);
Bignum& operator>>(int leng);
Bignum(const int );
Bignum(const char*);
Bignum& operator=(const Bignum&);
Bignum operator+(const Bignum&);
Bignum operator-(const Bignum&);
Bignum operator*(const Bignum&);
Bignum operator/(const Bignum&);
//Bignum& operator>>(int leng);
};
/*Bignum& Bignum::operator<<(int leng){
int b=len-leng;
if ( b <=0 )
{
return Bignum(0);
}
else{
for (int i=0;i<len;i++)
{
if ((i+leng)<25)
num[i]=num[i+leng];
}
for (int j=0;j<leng;j++)
{
num[len-1-j]=0;
}
}
len=len-leng;
return *this;
}*/
Bignum& Bignum:: operator>>(int leng){
if(len==1 ){
len=(len+leng)>25? 25:(len+leng);
num[len-1]=num[0];
for (int i=0;i<=len-2;i++)
{
num[i]=0;
}
return *this;
}
for (int i=len-1;i>=0;i--)
{
if((i+leng)<25)
num[i+leng]=num[i];
}
for(int j=0;j<leng;j++){
num[j]=0;
}
len=(len+leng)>25? 25:(len+leng);
/*if ((len+leng)<=25)
{
for (int i=0;i<len;i++)
{
num[i+leng]=num[i];
}
for (int j=0;j<leng;j++)
{
num[j]=0;
}
len+=leng;
}
else{
for (int i=0;i<25;i++)
{
if ((i+leng)<25)
{
num[i+leng]=num[i];
}
}
for (int j=0;j<leng;j++)
{
num[j]=0;
}
len=25;
}*/
return *this;
}
Bignum& Bignum:: operator=(const Bignum& B){
memset(num,0,sizeof(num));
len=B.len;
for (int i=0;i<len;i++)
{
num[i]=B.num[i];
}
return *this;
}
bool Bignum:: operator>(const Bignum& A){
int index=len>=A.len ? len:A.len;
while((num[index-1]==A.num[index-1])&&index>0 ){
index--;
}
if( num[index-1]>A.num[index-1] )
return true;
else return false;
}
bool Bignum:: operator==(const Bignum& A ){
if (A.len==len){
for (int i=0;i<len;i++)
{
if (A.num[i]!=num[i])
{
return false;
}
}
return true;
}
else return false;
}
Bignum:: Bignum(const int a){
len=0; memset(this,0,sizeof(num));
int c=a; int d=a;
while(c>MAX){
d=c- (c/(MAX+1))*(MAX+1);
num[len++]=d;
c=c/(MAX+1);
}
num[len++]=c;
}
/*Bignum:: Bignum(const char* a){
int index,i,l,k,t;
memset(num,0,sizeof(num));
l=strlen(a);
len=l/4;
if(l%4!=0)
len++;
index=0;
for (i=l-1;i>=0;i-=4)
{
t=0;
k=i-4+1;
if(k<0)
k=0;
for (int j=k ; k<=i ;j++)
{
t+=t*10+a[j]-'0';
}
num[index++]=t;
}
}*/
istream& operator>>(istream& in, Bignum& b){
char ch[100];
int i;
in>>ch;
int l=strlen(ch);
int count=0;int sum=0;
for (i=l-1;i>=0;)
{
sum=0;
int t=1;
for (int j=0;j<4&&i>=0;j++,i--,t*=10)
{
sum+=(ch[i]-'0')*t;
}
b.num[count]=sum;
count++;
}
b.len=count++;
return in;
}
ostream& operator<<(ostream& os, Bignum& A){
int i;
os << A.num[A.len-1];
for (i=A.len-2;i>=0;i--)
{
os.width(4);
os.fill('0');
os<<A.num[i];
}
return os;
}
Bignum Bignum:: operator+(const Bignum& A){
int big=A.len>=len? A.len:len;
for (int i=0;i<big;i++)
{
num[i]+=A.num[i];
if(num[i]>MAX){
num[i+1]+=1; //index越大,位数越;
num[i]-=MAX+1;
}
}
if(num[big]!=0){
len=big+1;
}
else
len=big;
return *this;
}
Bignum Bignum:: operator-(const Bignum& A){
/* 位数 符号*/
int i,j,big;
Bignum t1,t2;
bool flag;
if(*this>A){
t1=*this;
t2=A;
flag=0;
}
else {
t1=A;
t2=*this;
flag=1;
}
big=t1.len;
for (i=0;i<big;i++)
{
if (t1.num[i]<t2.num[i])
{
j=i+1;
while(t1.num[j]==0)
j++;
t1.num[j--]--;
while(j>i)
t1.num[j--]=MAX;
t1.num[i]+=MAX+1-t2.num[i];
}
else{
t1.num[i]-=t2.num[i];
}
}
while(t1.num[big-1]==0 && big >1)
big--;
t1.len=big;
if(flag)
t1.num[big-1]=0-t1.num[big-1];
return t1;
}
Bignum Bignum:: operator* (const Bignum& A){
int i,j;
int temp;
Bignum temp_;
for (i=0;i<len;i++)
{
int up=0;
for (j=0;j<A.len;j++)
{
temp=num[i]*A.num[j]+temp_.num[i+j]+up;
if (temp>MAX)
{
temp_.num[i+j]=temp-temp/(MAX+1)*(MAX+1);
up=temp/(MAX+1);
}
else{
temp_.num[i+j]=temp;
up=0;
}
}
if (up!=0)
temp_.num[i+j]=up;
}
temp_.len=len+A.len;
while(temp_.num[temp_.len-1]==0 && temp_.len > 1)
temp_.len--;
return temp_;
}
Bignum Bignum:: operator/ (const Bignum& A){
Bignum temp1;
Bignum temp2;
Bignum temp3;
Bignum quotient;
Bignum remainder;
temp1= *this;
Bignum temp4;
Bignum temp5;
temp2=A;
temp3=A;
int ll=len-A.len;
int i;
if (temp1>temp2 && !(temp1==temp2))
{
temp2>>ll;
if( temp1>temp2 || temp1==temp2 ) //计算位数;
quotient.len=ll+1;
else
quotient.len=ll;
int lentemp=quotient.len-1;
temp2=A;
remainder=temp1;
while(ll>=0){
temp2>>ll;
//cout<<"移位"<<temp2;
if( remainder>temp2 || remainder==temp2 )
{
for ( i=1;i<=10000;i++)
{
temp4=remainder-Bignum(i)*temp2;
//cout<<"迭代:"<<temp4<<"长度:"<<temp4.len<<endl;
if(temp4 < Bignum(0) ){
i--;
break;
}
}
remainder=remainder-Bignum(i)*temp2;
//cout<<"余数"<<remainder<<endl;
//cout<<"商数"<<i<<endl;
quotient.num[lentemp--]=i;
//cout<<"上"<<quotient<<endl;
}
temp2=temp3;
ll--;
}
return quotient;
}
else if(temp1==temp2){
return Bignum(1);
}
else {
return Bignum(0);
}
}
int main(){
char s;
Bignum A;
Bignum B;
Bignum C;
cin>>A>>s>>B;
switch(s){
case'+':{C=A+B;}break;
case'-':{C=A-B;}break;
case'*':{C=A*B;}break;
case'/':{C=A/B;}break;
}
cout<<C;
return 0;
}