#include <iostream>
#include <string>
using namespace std;
class HugeInteger
{
public:
HugeInteger();
HugeInteger(char*);
void input();
void print();
bool isZero() const;
bool isEqualTo(const HugeInteger&);
bool isGreaterThan(const HugeInteger&);
bool isLessThan(const HugeInteger&);
HugeInteger Add(const HugeInteger&);
HugeInteger Sub(const HugeInteger&);
HugeInteger Multiply(const HugeInteger& b);
HugeInteger Divide(const HugeInteger& b);
private:
int intArray[40];
int size;
void setZero();
};
void HugeInteger::setZero()
{
for (int i = 0; i<40; i++)
intArray[i] = 0;
size=1;
}
bool HugeInteger::isZero() const
{
for (int i = 0; i<40; i++)
if (intArray[i] != 0) return false;
return true;
}
HugeInteger::HugeInteger()
{
setZero();
}
HugeInteger::HugeInteger(char *p)
{
setZero();
size = strlen(p);
for (int i=0; i<size; i++)
intArray[i]=p[size-1-i]-'0';
}
void HugeInteger::input()
{
char p[40];
setZero();
cin >> p;
size = strlen(p);
for (int i=0; i<size; i++)
intArray[i]=p[size-1-i]-'0';
}
void HugeInteger::print()
{
for (int i =size-1; i>=0; i--)
cout<< intArray[i];
cout<<endl;
}
bool HugeInteger::isEqualTo(const HugeInteger& b)
{
if (size!=b.size) return false;
for(int i=0; i<size; i++)
{
if(intArray[i]!= b.intArray[i])
return false;
}
return true;
}
bool HugeInteger::isGreaterThan(const HugeInteger& b)
{
if (size<b.size) return false;
if (size>b.size) return true;
for(int i=size-1; i>=0; i--)
{
if(intArray[i]< b.intArray[i])
return false;
if(intArray[i]>b.intArray[i])
return true;
}
return false;
}
bool HugeInteger::isLessThan(const HugeInteger& b)
{
if (size>b.size) return false;
if (size<b.size) return true;
for(int i=size-1; i>0; i--)
{
if(intArray[i]> b.intArray[i])
return false;
if(intArray[i]<b.intArray[i])
return true;
}
return false;
}
HugeInteger HugeInteger::Add(const HugeInteger& b)
{
int c=0;
HugeInteger temp;
if (b.isZero()) return *this;
if (this->isZero()) return b;
int max = size>b.size? size: b.size;
for (int i = 0; i<max; i++)
{
temp.intArray[i] = intArray[i]+b.intArray[i]+c;
if (temp.intArray[i]>9){
c = 1;
temp.intArray[i]-=10;
}
else c=0;
}
if (c==1){
if (max==40)
{
cout<< "overflow!";
temp.setZero();
return *this;
}
temp.size = max+1;
temp.intArray[max]=1;
}
else temp.size = max;
return temp;
}
HugeInteger HugeInteger::Sub(const HugeInteger& b)
{
int c=0;
HugeInteger temp;
if (this->isLessThan(b))
{
cout<<"Nagtive number is not supported";
return temp;
}
for (int i = 0; i<size; i++)
{
temp.intArray[i] = intArray[i]-b.intArray[i]-c;
if (temp.intArray[i]<0){
c = 1;
temp.intArray[i]+=10;
}
else c=0;
}
return temp;
}
HugeInteger HugeInteger::Multiply(const HugeInteger& b)
{
int c=0;
HugeInteger temp,result;
if (b.isZero()||this->isZero()) return temp;
for (int i = 0; i<b.size; i++)
{
c=0;
temp.setZero();
for(int j=0; j<size; j++)
{
temp.intArray[i+j] = intArray[j]*b.intArray[i]+c;
c=temp.intArray[i+j]/10;
temp.intArray[i+j]%=10;
}
temp.size = size+i;
if (c>0)
{
temp.size++;
if (temp.size ==40)
{
cout<<"overflow";
temp.setZero();
return temp;
}
temp.intArray[temp.size-1]=c;
}
result = result.Add(temp);
}
return result;
}
HugeInteger HugeInteger::Divide(const HugeInteger &b)
{
int c=0;
int i,j;
HugeInteger temp, tempa,tempb,result;
if (b.isZero())
{
cout<<"mistake! divisor cannot be zero";
return result;
}
if (this->isLessThan(b)) return result;
c= size-b.size;
tempa = *this;
tempb.size = tempa.size;
for ( j=b.size-1; j>=0; j--)
tempb.intArray[j+c]= b.intArray[j];
for (i=c; i>=0; i--)
{
while(!tempa.isLessThan(tempb))
{
tempa = tempa.Sub(tempb);
result.intArray[i]++;
}
tempb.size--;
for( j=0; j<tempb.size; j++)
tempb.intArray[j]=tempb.intArray[j+1];
tempb.intArray[tempb.size]=0;
}
if(result.intArray[c]==0) result.size = c;
else result.size = c+1;
return result;
}
int main()
{
HugeInteger a("123456"),b,c;
cout<<"a=";
a.print();
cout<<"b=";
b.input();
if (b.isGreaterThan(a))
cout<< "b is greater than a"<<endl;
if (a.isLessThan(b))
cout<<"a is Less than b"<<endl;
cout<<"a+b=";
c=b.Add(a);
c.print();
cout<<"a-b=";
c=a.Sub(b);
c.print();
cout<<"a*b=";
c=a.Multiply(b);
c.print();
return 0;
}