문제

따라서 간단한 절차는 계승 번호를 계산합니다. 코드는 다음과 같습니다.

int calcFactorial(int num)
{
    int total = 1;

    if (num == 0)
    {
        return 0;
    }

    for (num; num > 0; num--)
    {
        total *= num;
    }

    return total;
}

이제 이것은 대부분의 숫자에 대해 잘 작동하고 더 빠르고 우아한 솔루션이 있지만, 더 빠르고 우아한 솔루션이 있습니다). 그러나 250 IT와 같은 더 많은 숫자를 입력 할 때 무뚝뚝하게 말하면 헛소리를 내립니다. 이제 250의 첫 번째 커플 팩토 노트 "비트"는 참조를 위해 {250, 62250, 15126750, 15438000, 3813186000}입니다.

내 코드는 {250, 62250, 15126750, 15438000, -481781296 } 분명히 꺼져 있습니다. 나의 첫 번째 의심은 아마도 내가 32 비트 정수의 한계를 위반했을 것입니다. 그러나 2^32가 4294967296이라는 점을 감안할 때 나는 그렇게 생각하지 않습니다. 내가 생각할 수있는 유일한 것은 아마도 그것이 서명 32 비트 한도이지만 이런 종류의 일에 대해 생각할 수 없어야합니까? 서명이 문제라면 정수를 서명하지 않게함으로써이를 해결할 수 있지만 다음 반복이 4294967296 한도보다 훨씬 높은 938043756000을 생산하기 때문에 임시 솔루션 일뿐입니다.

그래서 내 문제가 서명 된 한계입니까? 그렇다면이 문제를 다시 만나지 않고 많은 숫자를 계산하기 위해 무엇을 할 수 있습니까?

도움이 되었습니까?

해결책

2^32는 서명 된 정수에 대한 제한을 제공하지 않습니다.

서명 된 정수 한계는 실제로입니다 2147483647 (MS 도구를 사용하여 Windows에서 개발하는 경우 다른 도구 수트/플랫폼은 아마도 비슷한 자체 제한을 가질 것입니다).

C ++ 대량 라이브러리가 필요합니다 이 같은.

다른 팁

다른 의견 외에도 코드에서 두 가지 심각한 버그를 지적하고 싶습니다.

  • 당신은 음수에 대한 경비가 없습니다.
  • 0의 Factorial은 0이 아닌 하나입니다.

예, 당신은 한계를 쳤다. C ++의 int는 정의에 따라 서명됩니다. 그리고, 아, 아니, c ++는 생각하지 않습니다. 당신이 그것을하는 것을 말하면, 그것은 분명히 잘못 되었더라도 그렇게 할 것입니다.

다수의 라이브러리를 고려하십시오. C ++에는 주변에 많은 것이 있습니다.

서명 또는 서명되지 않은 것을 지정하지 않으면 기본값이 서명됩니다. 컴파일러의 명령 줄 스위치를 사용 하여이 수정을 수정할 수 있습니다.

C (또는 C ++)는 매우 낮은 수준의 언어이며 정확하게 당신이 말하는 것. 이 값을 서명 된 INT에 저장하라고 말하면 그것이 할 일입니다. 프로그래머가 언제 문제인지 알아 내야합니다. 언어의 직업이 아닙니다.

내 Windows 계산기 (시작 실행 -Calc) 말해줘

hex (3813186000) =         E34899D0
hex (-481781296) = FFFFFFFFE34899D0

그렇습니다. 원인은 서명 된 한도입니다. Factorials는 정의상 긍정적일 수 있으며 양수에 대해서만 계산할 수 있으므로 인수와 반환 값은 어쨌든 서명되지 않은 숫자 여야합니다. (나는 모두가 사용한다는 것을 알고 있습니다 int i = 0 루프도 나도 마찬가지입니다. 그러나 값을 제쳐두고 값이 음수가 될 수 없다면 항상 서명되지 않은 변수를 사용해야합니다.

Factorials의 일반적인 문제는 쉽게 생성 할 수 있다는 것입니다. 매우 많은 숫자. 플로트를 사용하여 정밀도를 희생하지만 정수 오버플로 문제를 피할 수 있습니다.

오 잠깐, 내가 위에서 쓴 내용에 따라, 당신은 서명되지 않은 부유물을 만들어야합니다 ;-)

오버플로 문제가 있습니다. 팩토 노트는 정수의 한계를 쉽게 초과 할 수 있습니다. 당신은 당신의 기능을 복귀시키기 위해 당신의 기능을 변경할 수 있지만, 그것은 당신에게 조금 더 공간을 구입할 것입니다. 응용 프로그램에서는 종종 최종 결과가 두 배 안에 들어가는 숫자가 매우 적지 만 중간 단계는 그렇지 않습니다. 이 상황을 처리하는 방법을 설명하는 기사는 다음과 같습니다. http://www.johndcook.com/blog/2008/04/24/how-to-calculate-binomial-probabilities/

내가 잘 기억한다면 :

서명되지 않은 짧은 int = max 65535

서명되지 않은 int = 최대 4294967295

서명되지 않은 긴 = 최대 4294967295

서명되지 않은 길이 (int64) = Max 18446744073709551615

편집 된 출처 :

int/긴 최대 값

최신 컴파일러 변수

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top