|
저번에..큰 정수를 다루라는 질문을 했는데..이번엔 소스에서 에러좀 잡아 주십사 하고 이렇게 또 올립니다...
저번에 답변 주신분들께..먼저 감사의 말씀을..^^
여기서 +연산자에 대한건데..
10까지의 합이나 100까지의 합은 나오는데..왜 1000이나 10000이나 그 이상의 합은 제대로 안나오는거죠??
*연산자..즉 팩토티알은 1000!도 나오는데..
뭐가 잘못된건가요??
가르쳐 주세요..
오늘도 이렇게 밤을 세우는군요...벌써 9시네..자고 일어나면 답변이 있길 바라며....
오늘도 좋은 하루 되세요..
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#define MAX 3000
class Integer {
public:
int num[MAX];
void Print();
int PrintFile();
Integer &operator=(long n);
Integer &operator=(Integer &ob);
Integer operator*(Integer ob);
Integer operator+(Integer ob);
int operator==(Integer ob);
int operator==(long n);
Integer operator-(Integer ob);
Integer operator-(long n);
};
void Integer::Print()
{
long i, flag = 0;
if(num == 0) cout<<0;
else
{
for(i=MAX-1; i>=0; i--)
{
if(this->num[i] == 0 && flag == 0) continue;
else
{
if(flag == 0) flag = 1;
cout<<num[i];
}
}
}
}
int Integer::PrintFile()
{
FILE *fp;
fp = fopen("result.txt", "wt");
if(fp == NULL) return 0;
else
{
long i, flag = 0;
if(num == 0) cout<<0;
else
{
for(i=MAX-1; i>=0; i--)
{
if(this->num[i] == 0 && flag == 0) continue;
else
{
if(flag == 0)
{
flag = 1;
fprintf(fp, "[decimal point:%ld]\n", i+1);
}
fprintf(fp, "%d", num[i]);
}
}
}
fclose(fp);
return 1;
}
}
Integer &Integer::operator=(Integer &ob)
{
memcpy(num, ob.num, MAX*sizeof(int));
return *this;
}
Integer &Integer::operator=(long n)
{
memset(num, 0, MAX*sizeof(int));
long i;
if(n != 0)
{
i = 0;
while(n > 0)
{
num[i] = n % 10;
n /= 10;
i++;
}
}
return *this;
}
Integer Integer::operator*(Integer ob)
{
Integer result;
char carry=0;
long i, j;
result = 0;
for(i=0; i<MAX; i++)
{
for(j=0; j<MAX && ob.num[i] != 0; j++)
{
if(num[j] == 0 || i+j>MAX-1) continue;
result.num[i+j] += (num[j] * ob.num[i]);
carry = result.num[i+j] / 10;
if(carry > 0)
{
result.num[i+j] -= (carry * 10);
result.num[i+j+1] += carry;
carry = result.num[i+j+1] / 10;
if(carry > 0)
{
result.num[i+j+1] -= (carry * 10);
result.num[i+j+2] += carry;
}
}
}
}
return result;
}
int Integer::operator==(Integer ob)
{
for(long i=0; i<MAX; i++)
if(num[i] != ob.num[i]) return 0;
return 1;
}
int Integer::operator==(long n)
{
Integer tmp;
tmp = n;
if(*this == tmp) return 1;
else return 0;
}
Integer Integer::operator-(long n)
{
Integer result, tmp;
tmp = n;
result = *this - tmp;
return result;
}
Integer Integer::operator+(Integer ob)
{
Integer result;
int flag = 0;
result = 0;
for(long i=MAX-1; i>=0; i--)
{
if(num[i] == 0 && ob.num[i] == 0 && flag == 0) continue;
else
{
if(flag == 0) flag = 1;
result.num[i] = num[i] + ob.num[i];
if(result.num[i] > 9)
{
result.num[i] -= 10;
result.num[i+1] += 1;
}
}
}
return result;
}
Integer Integer::operator-(Integer ob)
{
Integer result;
int flag = 0;
result = 0;
for(long i=MAX-1; i>=0; i--)
{
if(num[i] == 0 && ob.num[i] == 0 && flag == 0) continue;
else
{
if(flag == 0) flag = 1;
result.num[i] = num[i] - ob.num[i];
if(result.num[i] < 0)
{
result.num[i+1] -= 1;
result.num[i] += 10;
}
}
}
return result;
}
Integer Factorial(long n)
{
Integer tmp, ret;
ret = 1;
if(n != 0)
{
for(long i=1; i<=n; i++)
{
tmp = i;
ret = ret * tmp;
}
}
return ret;
}
Integer Sum(long n)
{
Integer tmp, ret;
ret = 0;
if(n != 0)
{
for(long i=1; i<=n; i++)
{
tmp = i;
ret = ret + tmp;
}
}
return ret;
}
void main(void)
{
Integer b,c;
b = Factorial(5);
c = Sum(100000);
cout<<endl<<c.PrintFile()<<endl;
}
|