2016-08-30 6 views
-1

Я использую старый метод умножения школы для вычисления факториалов, но все же я получаю неправильный ответ для чисел, больших 13. Я знаю, что никакой тип данных не может содержать такое большое значение точно, поэтому я использую массив для хранения каждой цифры в номере отдельно.Где ошибка в моем коде для вычисления факториалов чисел до 99?

«cas» в коде обозначает количество факториалов, которое должно быть рассчитано.

Вот код-

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

Попробуйте использовать отладчик, чтобы поэтапно запускать вашу программу и видеть эволюцию переменных. Это поможет вам найти, где ошибка – Garf365

+0

Возможный дубликат: http://stackoverflow.com/questions/1384160/calculating-factorial-of-large-numbers-in-c – Garf365

ответ

1

Вы забыли сбросить перенос на 0 до умножения на десятки части числа.

} 
    *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;