//Methods of LongLongint
#include "LongLongint.h"
LongLongint::LongLongint(const char* ch)
{
len = strlen(ch);
data = new int[len];
for(int i = len - 1; i >= 0; --i)
data[i] = ch[len - 1 -i] - '0';
}
LongLongint::LongLongint()
{
data = new int[1];
data[0] = 0;
}
LongLongint::LongLongint(const LongLongint & num)
{
len = num.len;
data = new int[len];
for(int i = 0; i < len; ++i)
data[i] = num.data[i];
}
LongLongint::~LongLongint()
{
delete []data;
}
LongLongint LongLongint::add(const LongLongint& num2)
{
LongLongint result;
delete []result.data; //delete the initialize space
bool islonger = (len >= num2.len);
result.len = islonger ? len : num2.len;
result.data = new int[result.len];
int shorter_len = (not islonger) ? len : num2.len;
for (int i = 0; i < shorter_len ; ++i) //add the number on the same place
result.data[i] = data[i] + num2.data[i];
for(int i = shorter_len; i < result.len; ++i) //add the rest of number
result.data[i] = islonger ? data[i] : num2.data[i];
for (int i = 0; i < result.len - 1; ++i) //carry the number
if(result.data[i] > 9)
{
result.data[i] %= 10;
++result.data[i+1];
}
if(result.data[result.len - 1] < 10) //no need to carry
return result;
else //the length of the array is not enough
{
result.data[result.len - 1] %= 10;
LongLongint new_result;
delete [] new_result.data;
new_result.len = result.len+1;
new_result.data = new int[new_result.len];
for(int i = 0; i < new_result.len - 1; ++i)
new_result.data[i] = result.data[i];
new_result.data[new_result.len - 1] = 1;
return new_result;
}
}
void LongLongint::display()
{
for(int i = len - 1; i >= 0; --i)
cout << data[i];
}
LongLongint operator+ (const LongLongint &num1, const LongLongint &num2)
{
LongLongint result;
delete []result.data; //delete the initialize space
bool islonger = (num1.len >= num2.len);
result.len = islonger ? num1.len : num2.len;
result.data = new int[result.len];
int shorter_len = (not islonger) ? num1.len : num2.len;
for (int i = 0; i < shorter_len ; ++i)
result.data[i] = num1.data[i] + num2.data[i];
for(int i = shorter_len; i < result.len; ++i)
result.data[i] = islonger ? num1.data[i] : num2.data[i];
for (int i = 0; i < result.len - 1; ++i) //carry the number
if(result.data[i] > 9)
{
result.data[i] %= 10;
++result.data[i+1];
}
if(result.data[result.len - 1] < 10) //no need to carry
return result;
else //the length of the array is not enough
{
result.data[result.len - 1] %= 10;
LongLongint new_result;
delete [] new_result.data;
new_result.len = result.len+1;
new_result.data = new int[new_result.len];
for(int i = 0; i < new_result.len - 1; ++i)
new_result.data[i] = result.data[i];
new_result.data[new_result.len - 1] = 1;
return new_result;
}
}
ostream &operator << (ostream &os, const LongLongint &num)
{
for (int i = num.len - 1; i >= 0; --i)
os << num.data[i];
return os;
}