다음 코드에는 해결할 수없는 문제가 있습니다.
#include <stdio.h>
#include <stdlib.h>
int factorial(long long int x) {
long long int temp;
temp = x - 1;
for (; temp > 0; temp--) {
x = x * temp;
}
return x;
}
int main() {
long long int x, fact;
while (1) {
printf("Please enter the number that you want to learn factoriel...\n(To quit press ctrl+c)\n");
scanf("%lld", &x);
if (x == EOF) {
break;
}
if (x >= 0) {
fact = factorial(x);
printf("Factorial of %lld is %lld\n", x, fact);
} else {
fact = 0;
printf("Factorial of %lld is %lld\n", x, fact);
}
}
printf("The Program has successfully terminated...\n");
return 0;
}
우선, 17까지 작동하지만 17에서 결과적으로 음수 무리를 제공하고 나중에 몇 개의 숫자를 결과로 0을 제공합니다
이 문제를 어떻게 해결합니까?
문제는 변수가 오버플로된다는 것입니다. 즉 sizeof(variable)
, 숫자를 저장하기 위해 바이트가 예약되어 있지만 숫자는 예약 된 것보다 더 많은 바이트가 필요합니다.
uint32_t는 0에서 2 ^ 32 = 4,294,967,296의 범위를 제공하므로 다른 정수 유형과 동일하게 숫자 5000000000을 (올바르게) 저장할 수 없습니다.
몇 가지 선택 사항이 있습니다.
unsigned
대신 사용 signed
하여 범위 확장가격은 첫 번째 (상황에 따라 두 번째)를 제외하고 모든 옵션이 CPU 소비를 증가 시킨다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다