2016-07-06 10 views
2

Я написал код, который вычисляет факториал после создания функции myFactorial, однако я испортил его, когда пытался обработать большие числа.Длительная обработка формата при вычислении факториала

Я пытаюсь иметь дело с цифрами выше 16, используя длинный формат, но результаты не имеют значения, и во второй части кода ситуация становится более странной. Хотя результаты не должны меняться при вводе, они меняются!

Я разделяю мой код с комментариями ниже:

main.c

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
    int yourNumber; 
    int i; 

    //Take the input 
    printf("I highly recommend you to make the command window fullscreen. Otherwise, the complete output will not be seen.\n"); 
    printf("Enter a positive integer and I will tell you its factorial.\n"); 
    scanf("%d", &yourNumber); 

    //Calculate factorial and print it in three ways 
    printf("Factorial of %d is %d!\n",yourNumber,myFactorial(yourNumber)); 
    printf("Using long format, factorial of %d is %lld!\n",yourNumber,myFactorial(yourNumber)); 
    printf("In hex: %#08X!",myFactorial(yourNumber)); 




    // Here on, second part of my code begins 


    // Calculate and print factorials of numbers from 1 to 20 in %d format 
    printf("\n\n\nLet's see more d's!\n\n"); 
    for (i = 1; i<21; i++) printf("%d\n", myFactorial(i)); 

    // Calculate and print factorials of numbers from 1 to 20 in %lld format 
    printf("\n\n\nNow let's see more lld's!\n\n"); 
    for (i = 1; i<21; i++) printf("%lld\n", myFactorial(i)); 


    return 0; 
} 

myfactorial.c

#include <stdio.h> 

long long int myFactorial(int bar) { 
    long long out = 1; 
    int i; 
    for (i=1; i<=bar; i++) 
    { 
     out *= i; 
    } 
    return out; 
} 
+1

Не могли бы вы рассказать о проблеме, с которой вы столкнулись? Факториал корректен: http://cpp.sh/8twwh –

+0

Привет, использование длинного длинного также приведет к переполнению большого диапазона. если вы действительно хотели научиться пройти через это. http://www.geeksforgeeks.org/factorial-large-number/ or https://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc- а-учебник –

ответ

2

У вас есть проблемы с printf форматов:

Все printf, который печатает возвращенное значение myFactorial должны использовать формат %lld для long long int

printf, который печатает значение HEX должны использовать %llX для печати Правильное значение

//Calculate factorial and print it in three ways 
printf("Factorial of %d is %lld!\n",yourNumber,myFactorial(yourNumber)); 
printf("Using long format, factorial of %d is %lld!\n",yourNumber,myFactorial(yourNumber)); 
printf("In hex: %#016llX!",myFactorial(yourNumber)); 

// Here on, second part of my code begins 

// Calculate and print factorials of numbers from 1 to 20 in %d format 
printf("\n\n\nLet's see more d's!\n\n"); 
for (i = 1; i<21; i++) printf("%lld\n", myFactorial(i)); 

// Calculate and print factorials of numbers from 1 to 20 in %lld format 
printf("\n\n\nNow let's see more lld's!\n\n"); 
for (i = 1; i<21; i++) printf("%lld\n", myFactorial(i)); 

Вы можете просто найти те виды ошибок добавление опции -Wall при компиляции с gcc. Он покажет вам

test.c: In function ‘main’: 
test.c:84:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long long int’ [-Wformat=] 
    printf("Factorial of %d is %d!\n",yourNumber,myFactorial(yourNumber)); 
    ^
test.c:86:5: warning: format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘long long int’ [-Wformat=] 
    printf("In hex: %#08X!",myFactorial(yourNumber)); 
    ^
test.c:94:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long long int’ [-Wformat=] 
    for (i = 1; i<21; i++) printf("%d\n", myFactorial(i)); 

Лучший добавив все следующие опции: -Wall -Wextra -pedantic

Обратите внимание, что ваш код может работать корректно, насколько факториал меньше 9223372036854775807, что является максимально допустимым для long long int

Это значит, что вы можете вычислить факториал, где x <= 20

 Смежные вопросы

  • Нет связанных вопросов^_^