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
[19403] 또다시 질문 올립니다....큰 정수 처리에서요...
박희중 [] 707 읽음    2002-06-16 09:11
저번에..큰 정수를 다루라는 질문을 했는데..이번엔 소스에서 에러좀 잡아 주십사 하고 이렇게 또 올립니다...
저번에 답변 주신분들께..먼저 감사의 말씀을..^^



여기서 +연산자에 대한건데..

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;
}




+ -

관련 글 리스트
19403 또다시 질문 올립니다....큰 정수 처리에서요... 박희중 707 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.