Факториал с использованием сложения - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь создать код C, который находит факториал целого числа, чтобы я мог преобразовать свой код в ассемблер.Кажется, мой код «умножает» второе целое число дважды.то есть 5 * 4 * 4 * 3 ... Я не могу понять, почему.Помогите пожалуйста!

#define N 5

int main() {

    int j = 0;
    int i = 0;

    int num1 = N;
    int num2 = N - 1;
    int sum = 0;

    while (num2 != 0) {
        while (j < num2) {
            sum += num1;
            j++;
        }
        j = 0;
        printf("%d\n", sum);
        printf("--------------\n");
        --num2;
        num1 = sum;
    }
    printf("--->%d", sum);
}

Ошибочный вывод:

20
--------------
80
--------------
240
--------------
480
--------------
480

Ответы [ 3 ]

2 голосов
/ 10 марта 2019

Вот состояние машины, из которого вы сможете понять, почему ваш алгоритм неверен:

enter image description here

PS Еще один, возможно, лучшеМожно подумать, что ваша математика не так.Вы делаете три умножения (повторения внутреннего цикла - умножение на целое число с использованием повторного сложения).Но вы также делаете три добавления продуктов.Эти суммы говорят вам, что вы не вычисляете факториал.

0 голосов
/ 10 марта 2019

Если вы добавите некоторые промежуточные выходные данные отладки, вы обнаружите, где вы ошиблись:

#include <stdio.h>

#define N 5

int main()
    {
    int j = 0;
    int i = 0;

    int num1 = N;
    int num2 = N - 1;
    int sum = 0;

    while (num2 != 0)
        {
        printf("1 -> num1=%d  num2=%d  sum=%d  j=%d\n", num1, num2, sum, j);

        while (j < num2)
            {
            sum += num1;
            j++;
            }

        printf("2 -> num1=%d  num2=%d  sum=%d  j=%d\n", num1, num2, sum, j);

        j = 0;
        printf("%d\n", sum);
        printf("--------------\n");
        --num2;
        num1 = sum;
        }

    printf("--->%d", sum);
    }

Это приводит к:

1 -> num1=5  num2=4  sum=0  j=0
2 -> num1=5  num2=4  sum=20  j=4
20
--------------
1 -> num1=20  num2=3  sum=20  j=0
2 -> num1=20  num2=3  sum=80  j=3
80
--------------
1 -> num1=80  num2=2  sum=80  j=0
2 -> num1=80  num2=2  sum=240  j=2
240
--------------
1 -> num1=240  num2=1  sum=240  j=0
2 -> num1=240  num2=1  sum=480  j=1
480
--------------
--->480

Здесь вы можете видеть, что проблема в том, чтоЗначение sum переносится с каждого прохода через цикл, когда оно действительно должно каждый раз сбрасываться в 0.Поэтому добавьте

sum = 0;

вверху цикла while.

Таким образом, ваш окончательный код станет:

#include <stdio.h>

#define N 5

int main()
    {
    int j = 0;
    int i = 0;

    int num1 = N;
    int num2 = N - 1;
    int sum = 0;

    while (num2 != 0)
        {
        sum = 0;

        while (j < num2)
            {
            sum += num1;
            j++;
            }

        j = 0;
        printf("%d\n", sum);
        printf("--------------\n");
        --num2;
        num1 = sum;
        }

    printf("--->%d", sum);
    }

Удачи.

0 голосов
/ 10 марта 2019

Шаги для вычисления неверны: проще начать с низких коэффициентов к большим.

Вот исправленная версия:

#include <stdio.h>

#define N 10

int main() {
    int i, j, num1, sum;

    num1 = 1;
    sum = 1;
    for (i = 1; i <= N; i++) {
        sum = 0;
        for (j = 0; j < i; j++) {
            sum += num1;
        }
        printf("%d! -> %d\n", i, sum);
        printf("--------------\n");
        num1 = sum;
    }
    return 0;
}

Вывод:

1! -> 1
--------------
2! -> 2
--------------
3! -> 6
--------------
4! -> 24
--------------
5! -> 120
--------------
6! -> 720
--------------
7! -> 5040
--------------
8! -> 40320
--------------
9! -> 362880
--------------
10! -> 3628800
--------------
...