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
[19442] 비슷한 질문 3번째..
박희중 [] 651 읽음    2002-06-17 23:42
송득보님이 말씀하신대로 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(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번째.. 송득보 653 2002/06/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.