강의로 돌아가기
Sparrow

c++ __int128 까지 썼는데 왜안될까용 9ㅅ9

테스트 5~7, 26~35 안됩니다 ㅠ

작성중인 코드―solution.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

using namespace std;
// 팩토리얼 연산
long long int factorial(int num) {
    __int128 result = 1;
    for (int i = 1; i <= num; i++) {
        result *= i;
    }
    return result;
}

long long int solution(int balls, int share) {
    return factorial(balls) / (factorial(share) * factorial(balls-share));
}
  • junhak96@gmail.com

    30 팩토리얼이 대략 2 * 10^32제곱이라고 나오는데, long long int를 사용해도 범위가 넘어가는 것 같습니다.

    junhak96@gmail.com―2024.04.20 20:45
  • Sparrow

    아이고 그렇군요 감사합니다

    Sparrow―2024.04.23 03:18
  • sujung4394@gmail.com

    좀 늦은 것 같긴한데 코드를 단순히 팩토리얼만을 이용하여 구현하면 오버플로우가 일어날 가능성이 커집니다.

    sujung4394@gmail.com―2024.05.03 19:44
  • sujung4394@gmail.com

    예를 들어서 5C3같은 경우는 5C2로 바꾸고 5 * 4 / 2 * 1 같은 식으로 구현하도록 코드를 작성하면 오버플로우 가능성을 낮출 수 있습니다. 즉, 5P2 / 2!로 바꾸면 계산할 때 나오는 수가 작아지죠. 사실 그래도 unsigned long long int가 넘치는 경우가 있긴한데 하나밖에 없어서 찾으신 뒤에 고것만 예외처리 해주면 푸실 수 있을겁니다.

    sujung4394@gmail.com―2024.05.03 19:47
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.