C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[19437] Re:Re:또다시 질문 올립니다....큰 정수 처리에서요...
박희중 [] 603 읽음    2002-06-17 21:58
답변 감사 합니다..
그런데 b=Sum(100)을하면 5050이 나옵니다..
10을 하면 55가 나오구요..

그런데 1000을 하면 4100500이 나옵니다..

그리고decimal.은 6이 나오구요..7자리인데..

원래 100까지의 합은 500500아닙니까..그런데 왜 4100500이 나오는지요..

그게 좀 궁금합니다.


송득보 님이 쓰신 글 :
: 시간이 없는 관계로 소스를 꼼꼼히 살피지 못하는 점 이해해 주세요.
: +연산자 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;
: : }
: :
: :
: : 
: :

+ -

관련 글 리스트
19403 또다시 질문 올립니다....큰 정수 처리에서요... 박희중 708 2002/06/16
19413     Re:또다시 질문 올립니다....큰 정수 처리에서요... 송득보 640 2002/06/17
19437         Re:Re:또다시 질문 올립니다....큰 정수 처리에서요... 박희중 603 2002/06/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.