La magia de la aritmética de alta precisión
Después de todo, es más memorables gracias a pura cerebro hoyos Mano
#ifndef HUGEINTEGER_H
#define HUGEINTEGER_H
#include<iostream>
using namespace std;
class HugeInteger{
public:
HugeInteger();
friend ostream & operator<<(ostream &,const HugeInteger& );
void input(char*);
HugeInteger operator+(const HugeInteger& );
HugeInteger operator*(const HugeInteger& );
HugeInteger operator-(const HugeInteger& );
HugeInteger operator/(const HugeInteger& );
bool operator!=(const HugeInteger& );
bool operator>=(const HugeInteger& );
bool operator<=(const HugeInteger& );
bool operator==(const HugeInteger& );
bool operator<(const HugeInteger& );
bool operator>(const HugeInteger& );
// ~HugeInteger();
private:
int integer[100];
};
#endif
#include<iostream>
#include"HugeInteger.h"
using namespace std;
HugeInteger::HugeInteger(){for(int i=0;i<100;i++)integer[i]=0;}
void HugeInteger::input(char*ch)
{
int t=0;
while(*(ch+t)!='\0')t++;t--;
for(int i=0;i<=t;i++)integer[i]=*(ch+t-i)-'0';
}
bool HugeInteger::operator>(const HugeInteger& integer1)
{
for(int i=99;i>=0;i--)
{
if(integer[i]<integer1.integer[i])return 0;
if(integer[i]>integer1.integer[i])return 1;
}
return 1;
}
bool HugeInteger::operator==(const HugeInteger& integer1)
{
for(int i=99;i>=0;i--)
{
if(integer[i]!=integer1.integer[i])return 0;
}
return 1;
}
bool HugeInteger::operator<(const HugeInteger& integer1)
{
if((*this>integer1)||(*this==integer1))return 0;
return 1;
}
bool HugeInteger::operator!=(const HugeInteger& integer1)
{
return !(*this==integer1);
}
HugeInteger HugeInteger::operator+(const HugeInteger& integer2)
{
HugeInteger answer1;int t,c;
for(int i=0;i<99;i++)
{
t=answer1.integer[i]+integer[i]+integer2.integer[i];
c=t%10;t/=10;
answer1.integer[i]=c;answer1.integer[i+1]=t;
}
answer1.integer[99]+=integer2.integer[99]+integer[99];
return answer1;
}
HugeInteger HugeInteger::operator-(const HugeInteger& integer2)
{
HugeInteger answer,tmp;
for(int i=0;i<99;i++)
{
answer.integer[i]+=integer[i]-integer2.integer[i];
if(answer.integer[i]<0)answer.integer[i]+=10,answer.integer[i+1]-=1;
}
answer.integer[99]+=(integer[99]-integer2.integer[99]);
return answer;
}
HugeInteger HugeInteger::operator*(const HugeInteger& integer2)
{
HugeInteger answer;
int i=99,j=99;
while(!integer[i])i--;
while(!integer2.integer[j])j--;
for(int k=0;k<=j;k++)
{
if(!integer2.integer[k])continue;
HugeInteger tmp1,tmp2;int t=0,c=0;
for(int m=i;m>=0;m--)tmp1.integer[m+k]=integer[m];
for(int m=k;m<=k+i;m++)
{
t=tmp1.integer[m]*integer2.integer[k];
c=t%10;t/=10;
tmp2.integer[m]+=c;tmp2.integer[m+1]+=t;
}
answer=answer+tmp2;
}
return answer;
}
HugeInteger HugeInteger::operator/(const HugeInteger& integer1)
{
HugeInteger answer,tmp1;
tmp1=*this;
int i=99,j=99;
while(!integer1.integer[j])j--;
while(tmp1>integer1)
{
HugeInteger tmp2;
int k;
while(!tmp1.integer[i])i--;
k=i-j;
if(tmp1.integer[i]<integer1.integer[j])k--;
int t=0;
for(int f=k;f<=i;f++)
tmp2.integer[t++]=tmp1.integer[f];
int ans=0;
while(tmp2>integer1)
{
ans++;
tmp2=tmp2-integer1;
}
t=0;
for(int f=k;f<=i;f++)tmp1.integer[f]=tmp2.integer[t++];
answer.integer[k]=ans;
}
return answer;
}
ostream & operator<<(ostream & co,const HugeInteger& integer1)
{
int i=99;
while(!integer1.integer[i])i--;
while(i>-1){co<<integer1.integer[i];i--;}
co<<endl;
return co;
}
#include<iostream>
#include"HugeInteger.h"
#include<cstdio>
using namespace std;
int main()
{
char ch1[100],ch2[100],f;
while(1)
{
HugeInteger integer1,integer2,answer;
cout<<"@ to end"<<endl;
cin>>ch1;if(ch1[0]=='@')break;
cin>>f;
cin>>ch2;
integer1.input(ch1);integer2.input(ch2);
if(f=='+')answer=integer1+integer2;
else if(f=='-')answer=integer1-integer2;
else if(f=='*')answer=integer1*integer2;
else if(f=='/')answer=integer1/integer2;
cout<<"="<<answer<<endl;
if(integer1==integer2)cout<<"integer1 is equal to integer2"<<endl;
if(integer1!=integer2)cout<<"integer1 is not equal to integer2"<<endl;
if(integer1<integer2)cout<<"integer1 is less than integer2"<<endl;
if(integer1>integer2)cout<<"integer1 is larger than integer2"<<endl;
cout<<endl;
}
system("pause");
return 0;
}