팩토리얼 계산에서 이상한게 발견돼서 질문합니다!

조회수 1014회

1.

#include <stdio.h>

int main(void){
    int a,i;

    scanf("%d",&a);

    for(i=1; i<a; i++)
    {
        a = a*i;
    }

    printf("%d",a);

    return 0;
}

2.

#include <stdio.h>

int main(void){
    int a,i;

    scanf("%d",&a);

    for(i=a-1; i>0; i--)
    {
        a = a*i;
    }

    printf("%d",a);

    return 0;
}

만약 둘다 입력이 5일때
1번 코드와 2번코드 둘다 5~1까지 곱하는거는 다를게 없는데 결과가 다르게 나옵니다
1번코드는 -1899959296 가 나오고
2번코드는 정상적으로 120이 나오는데 이유를 모르겠어서 질문드립니다!

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    혹시나 싶어서 -1899959296으로 찾아봤는데 질문하고 계신 것과 너무나 똑같은 스택오버플로 질답이 이미 있었습니다.

    int a = 5;
    for (i=1; i<a; i++) { // <-- A
       a = a*i;           // <-- B
    }                     // <-- C
    

    for는 다음과 같이 순회합니다.

    1. A에 도달 - i = 1, a = 5, i<a는 참
    2. B에 도달 - i = 1, a = 5
    3. A에 도달 - i = 2, a = 5, i<a는 참
    4. B에 도달 - i = 2, a = 10
    5. A에 도달 - i = 3, a = 10, i<a는 참
    6. B에 도달 - i = 3, a = 30
    7. A에 도달 - i = 4, a = 30, i<a는 참
    8. B에 도달 - ...

    보시다시피 이 루프는 C에 절대 닿을 수가 없는데 왜냐하면 for문 정의 안에 있는 a가 계속 변경되고 있기 때문입니다. 그래서 너무 큰 값이 찍혀버리는데 그 표현이 -1899959296인 거구요. (maxValue 어쩌고 하는 게 있는 모양인데 여기서부터는 제가 C를 몰라서 생략하겠습니다.)

    다음 코드가 정상 작동함을 확인해 보세요.

    #include <stdio.h>
    int main(void) {
        int a, factorial;
        a = 5;
        factorial = a;
        // 이제 다음 for가 순회되는 동안 a는 변경되지 않는다.
        for (int i = factorial - 1; i > 0; i--) {
            // 반환될 값 factorial만이 루프에 의해 변경된다.
            factorial *= i;
        }
        // 출력: 120 ( = 5 * 4 * ... * 1)
        printf("%d", factorial);
        return 0;
    }
    

    교훈: 예상치 않은 결과가 나오면 그대로 복사해서 설마 이것도 있겠냐 싶은 생각으로 구글에 넣어 봅시다.

    • 헉... 맞네요... a가 계속 증가하니까... ㄷㄷㄷㄷ 감사합니다!! 밑에 코드도 잘 작동하네요! steampower33 2019.6.1 00:26

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)