2016-07-06 19 views
2

Ich schrieb einen Code, der faktoriell nach dem Erstellen einer myFactorial-Funktion berechnet, aber ich vermasselte es, wenn ich versuchte, größere Zahlen zu behandeln.Langformatige Verarbeitung bei der Berechnung von Fakultät

Ich versuche, mit Zahlen über 16 mit langen Format zu beschäftigen, aber die Ergebnisse sind irrelevant und die Dinge werden seltsamer im zweiten Teil des Codes. Während sich die Ergebnisse nicht mit der Eingabe ändern sollten, ändern sie sich!

ich meinen Code mit Kommentaren unten teilen:

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

Können Sie das Problem, dem Sie gegenüberstehen, erläutern? Die faktorielle Ausgabe ist korrekt: http://cpp.sh/8twwh –

+0

Hi, die Verwendung von long long führt ebenfalls zu einem Überlauf der langen Reichweite. Wenn Sie wirklich lernen wollten, gehen Sie das durch. http://www.geeksforgeeks.org/factorial-large-number/ Oder https://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc- Ein-Tutorial –

Antwort

2

Sie haben Probleme mit Ihrem printf Formate:

All printf, dass der Rückgabewert von myFactorial druckt muss %lld Format verwenden, für long long int

printf, dass der HEX-Wert druckt %llX verwenden muß, um den korrekten Wert

//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)); 

Sie können einfach diese Art von Fehlern finden drucken Hinzufügen von -Wall Option beim Kompilieren mit gcc. Es zeigt Ihnen

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)); 

Beste Hinzufügen alle folgende Option: -Wall -Wextra -pedantic

Beachten Sie, dass der Code richtig so weit arbeiten können als die Fakultäts weniger als 9223372036854775807 ist, dass das Maximum für long long int

erlaubt ist

das bedeutet, dass Sie die Fakultät berechnen kann, wo x <= 20

Verwandte Themen