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
[19482] Re:비슷한 질문 3번째..
송득보 [] 652 읽음    2002-06-20 12:01
글을 이제서야 봤습니다. 나름대로의 소견을 첨부(아래)합니다.

-locke

박희중 님이 쓰신 글 :
: 송득보님이 말씀하신대로 i+1번째도 고려 했습니다..
: 예...1000까지는 500500이 나와서 잘된줄알앗는데..
: 10000을 집어 넣으니...또 410005000이렇게 나옵니다..
:
: 이건 왜이런 겁니까..
:
: 그리고 10을 넣으면 55 100을 넣으면 5050이 나오는데..그럼 문제 가 없다는거 아닙니까..
:
: 만약 님 말대로라면 10일때 55가 아니라 415이어야 하고
:
: 100일때는 41050이어야 하는거 아닌가요..
:
: 처음에는 배열이 0,0,5,0,10,4가 나와서 답은 맞다고 생각했습니다만..
:
: 즉 10이 올라가면 0,0,5,0,0,5가 나온다고 믿었는데..
:
: 그게 아니더군요..도대체 이해가 안갑니다..
:
: 조금만 도와주세요..
:
: 그럼 좋은 하루 되세요..
:
: (+연산자는 합을 구하는 겁니다..)
:
: #include <iostream.h>
: #include <stdio.h>
: #include <string.h>
:
: #define MAX 100
:
: 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--)
:     {
:        
:         result.num[i] = num[i] + ob.num[i];
:             if(result.num[i] > 9 )
:             {
:                
:                 result.num[i] -= 10;
:                 result.num[i+1] += 1;
:            
이 문제는 if문 하나 추가해서 해결될 문제는 아닌것 같네요.
예를 들어..  99999 + 1의 경우를 생각해 봅시다.
[0]  [1]  [2]  [3]  [4]  [5]
9     9    9    9    9    9
i의 첨자가 큰 인덱스부터 0까지 감소를 합니다.
특정 인덱스의 값에 1을 더한 후 9보다 클 때 [i+1]에 1을 올리고
[i+1]이 9보다 큰지를 검사하여 i+2에 넣는 방식인데..
그렇다면.. i+2도 9보다 크면 어떻게 하죠?
이 루틴은 첨자 인덱스값이 계속 감소하므로 이런식으로는
제대로 처리를 할 수가 없죠.
연산은 연산대로 하고.. limit check하는 함수를 만들어
if문 대신 호출하여 9보다 큰 값을 갖는 인덱스에 대해서는
값을 조정해주는 함수를 추가하시는게 좋을듯 싶습니다.
도움이 되셨기를...
:             if(result.num[i+1] > 9 )
:                 {
:                 result.num[i+1] -= 10;
:                 result.num[i+2] += 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=0; i<=n; i++)
:
:         {
:             tmp = i;
:             ret = ret + tmp;
:
:         }
:
:     }
:     return ret;
:
: }
:
:
: void main(void)
: {
:
:     Integer b,c;
:     b = Factorial(5);
:     c = Sum(10000);
:     cout<<endl<<c.PrintFile()<<endl;
: }
:
:

+ -

관련 글 리스트
19442 비슷한 질문 3번째.. 박희중 651 2002/06/17
19482     Re:비슷한 질문 3번째.. 송득보 652 2002/06/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.