하지만 허접하게 구현해서 몇가지 제약사항이 있다.
<주의사항>
1. 뺄셈 operator 사용시 호출인자가 더 큰값이어야 한다.(아닐경우 unhandling)
2. 나눗셈 미구현
#include<string>
#define SIZE 100
using namespace std;
class BigInteger
{
private:
string num;
int range; //배열사용범위 표시
int number[SIZE]; // 배열 1칸에 4자리의 숫자(0001~9999)가 들어간다
int go_up[SIZE+1]; // 사칙연산 후 올림을 위한 수가 저장된다.
public:
BigInteger(string n);
string getNum();
int* getNumber();
int getRange();
void operator+(BigInteger bi);
void operator-(BigInteger bi); //앞의 인자(호출인자)가 무조건 크다는 전제
void operator*(BigInteger bi);
void operator/(BigInteger bi); //미구현
};
BigInteger::BigInteger(string n)
{
memset(number,0,sizeof(int)*SIZE);
memset(go_up,0,sizeof(int)*SIZE);
num = n;
int insert0 = n.size()%4;
string tmp;
for(int i=0; i<(4-insert0); i++)
{
n.insert(0,"0");
}
int index = (n.size()-1)/4;
range = index;
for(int i=0; index>=0;i++, index--)
{
tmp = n.substr(4*i,4);
number[index] = atoi(tmp.c_str());
}
}
int BigInteger::getRange()
{
return range;
}
int* BigInteger::getNumber()
{
return number;
}
string BigInteger::getNum()
{
string largeNum;
char tmp[5];
for(int i=0; i<=range; i++)
{
itoa(number[i],tmp,10);
largeNum.insert(0,tmp);
}
return largeNum;
}
void BigInteger::operator+(BigInteger bi)
{
int index = range;
int* big = bi.getNumber();
if(bi.getRange()>index)
index=bi.getRange();
for(int i=0; i<index; i++)
{
number[i]= number[i] + big[i] + go_up[i];
go_up[i+1] = number[i]/10000;
number[i] = number[i]%10000;
}
//range 재조정
for(int i=SIZE-1; i>=0; i--)
{
if(number[i]>0)
{
range=i;
break;
}
}
memset(go_up,0, sizeof(int)*100);
}
// 뺄셈시 앞의 big Integer가 무조건 크다는 가정임
void BigInteger::operator-(BigInteger bi)
{
int index = range;
int* big = bi.getNumber();
if(bi.getRange()>index)
index=bi.getRange();
for(int i=0; i<index; i++)
{
number[i]= number[i] - big[i];
if( number[i] < 0) // 앞의 자리수에서 하나 꾸어 옴.
{
number[i+1]--;
number[i] = number[i] + 10000;
}
}
//range 재조정
for(int i=SIZE-1; i>=0; i--)
{
if(number[i]>0)
{
range=i;
break;
}
}
}
void BigInteger::operator*(BigInteger bi)
{
memset(go_up,0, sizeof(int)*100);
int index = range;
int* big = bi.getNumber();
int tmp[100];
if(bi.getRange()>index)
index=bi.getRange();
for(int i=0; i<range+1; i++)
{
for(int j=0; j<bi.getRange()+1; j++)
{
tmp[j] = number[j] * big[i];
go_up[i+j+1] += (tmp[j]+go_up[i+j])/10000;
go_up[i+j] = (tmp[j]+go_up[i+j])%10000;
}
}
memcpy(number,go_up,sizeof(int)*100);
//range 재조정
for(int i=SIZE-1; i>=0; i--)
{
if(number[i]>0)
{
range=i;
break;
}
}
memset(go_up,0, sizeof(int)*100);
}
댓글 없음:
댓글 쓰기