2016-08-30 2 views
-1

Ich benutze die Oldschool Multiplikation Methode, um die faktorials zu berechnen, aber immer noch bekomme ich falsche Antwort für Zahlen größer als 13. Ich weiß, dass kein Datentyp genau so einen großen Wert halten kann, so verwende ich ein Array, um jede Ziffer zu speichern in der Zahl getrennt.Wo ist der Fehler in meinem Code, um Faktorzahlen von Zahlen bis 99 zu berechnen?

"CAS" in Code bezeichnet die Nummer, von der Fakultät berechnet werden soll.

Hier ist die Code-

void factorial (int cas) 
{ 
    int num[158]; 
    num[0] = 1; 

    for (int i=1; i<158; i++) 
    { 
    num[i] = 0; 
    } 

    int row1[158]; 
    int row2[158]; 
    int length = 0; 
    int max = 0; 
    int carry = 0; 

    for (int j=1; j<=cas; j++) 
    { 
    for (int i=0; i<158; i++) 
    { 
     row1[i] = 0; 
     row2[i] = 0; 
    } 

    for (length=157; length>=0; length--) 
    { 
     if (num[length] != 0) 
     break; 
    } 

    if (j/10 < 1) 
    { 
     int* ptr = num; 
     carry = 0; 

     for (int i=0; i<=length; i++) 
     { 
     int mult = (j * num[i]) + carry; 
     int units = mult % 10; 
     carry = mult/10; 
     *ptr = units; 
     ptr++; 
     } 
     *ptr = carry; 
    } 
    else 
    { 
     int* ptr = num; 
     int* ptr1 = row1; 
     row2[0] = 0; 
     int* ptr2 = row2 + 1; 
     carry = 0; 

     for (int i=0; i<=length; i++) 
     { 
     int mult = ((j%10) * num[i]) + carry; 
     int units = mult % 10; 
     carry = mult/10; 
     *ptr1 = units; 
     ptr1++; 
     } 
     *ptr1 = carry; 

     for (int i=0; i<=length; i++) 
     { 
     int mult = ((j/10) * num[i]) + carry; 
     int units = mult % 10; 
     carry = mult/10; 
     *ptr2 = units; 
     ptr2++; 
     } 
     *ptr2 = carry; 

     for (max=157; max>=0; max--) 
     { 
     if (row1[max] != 0 || row2[max] != 0) 
     break; 
     } 

     carry = 0; 

     for (int i=0; i<=max; i++) 
     { 
     int add = row1[i] + row2[i] + carry; 
     int units = add % 10; 
     carry = add/10; 
     *ptr = units; 
     ptr++; 
     } 
     *ptr = carry; 
    } 

    } 
    for (length=157; length>=0; length--) 
    { 
     if (num[length] != 0) 
     break; 
    } 

    for (;length>=0;length--) 
    { 
    printf("%i",num[length]); 
    } 

    printf("\n"); 
} 
+2

Probieren Sie einen Debugger aus, um Schritt für Schritt Ihr Programm auszuführen und die Evolution der Variablen zu sehen. Es wird Ihnen helfen, zu finden, wo der Fehler ist – Garf365

+0

Mögliches Duplikat: http://StackOverflow.com/Questions/1384160/Calculating-Factorial-of-Large-Numbers-in-C – Garf365

Antwort

1

Sie haben vergessen, den Übertrag auf 0, bevor Multiplikation mit dem Zehn Teil Nummer zurückzustellen.

} 
    *ptr1 = carry; 

    carry = 0; // ADDED LINE: Reset carry before multiplying with the tens part 

    for (int i=0; i<=length; i++) 
    { 
    int mult = ((j/10) * num[i]) + carry; 
Verwandte Themen