|
시간이 없는 관계로 소스를 꼼꼼히 살피지 못하는 점 이해해 주세요.
+연산자 implementation에 제 소견을 첨부했습니다.
-locke
박희중 님이 쓰신 글 :
: 저번에..큰 정수를 다루라는 질문을 했는데..이번엔 소스에서 에러좀 잡아 주십사 하고 이렇게 또 올립니다...
: 저번에 답변 주신분들께..먼저 감사의 말씀을..^^
:
:
:
: 여기서 +연산자에 대한건데..
:
: 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;
루핑이 i가 큰 수부터 작은 쪽으로 감소를 하는데
두 수를 더하여 십의 자리가 되는 수를 [i+1]에 더하시면
num[i+1]의 값이 > 9인 경우를 처리하는 루틴이 없네요.
i는 계속 감소하니까 루프가 끝나도 i+1은 검사를 안할테니 말입니다.
이 루틴으로 만약 99999 + 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;
: }
:
:
:
:
|