Факториал(ы) из N чисел в цикле for

Я работаю над проблемой с CodeChef где мне нужно вычислить факториал из n чисел.

пользователь вводит число, которое определяет, сколько интов для выполнения факториального расчета, а затем вводит числа для расчета.

моя проблема заключается в самом умножении. Например, если у меня есть int == 5, то результат будет 20 (он будет вычислять n только по последнему факториалу, а не по всем из них)

здесь проблема существует:

for(int x = 0; x < _numbersToProcess.Length; x++) {// Loop throuigh Array by index
    for (int y = 1; y < _numbersToProcess[x]; y++) {// Y is equal to less than index x
         _result[x] = _numbersToProcess[x] * y;// Multiply x by y then add to array
    }
}

внешний цикл определяет, сколько вычислений нужно выполнить.

внутренняя петля calulates факториалов перебирая каждый индекс _numberToProcess и умножение его на каждое число меньше, чем число, на которое будет рассчитываться.

проблема в том, что факториальный расчет перезаписывает себя,

например:

факториал 5 результат: 20 но он должен быть 120 (он перезаписывает себя, пока он достигает последнего множителя)

поэтому я попробовал следующее:

_result[x] = _numbersToProcess[x] *= y;

это, очевидно, то же самое, что _numbersToProcess[x] = _numbersToProcess[x] * y;

но это дает совершенно другой результат:

если мы снова вводим 5, то это приведет к выходу -1899959296.

Я знаю, что могу легко копировать и вставлять из других представлений, но я хочу знать, почему мой метод не приводит к правильному выходу.

вот метод в его полноте:

int _numbers = int.Parse(Console.ReadLine());// Get number of ints to calculate
        int[] _numbersToProcess = new int[_numbers];// Array of inputs
        int[] _result = new int[_numbers];
        int i = 0;

        while(i < _numbersToProcess.Length) {
            _numbersToProcess[i] = int.Parse(Console.ReadLine());
            i++;
        }

        for(int x = 0; x < _numbersToProcess.Length; x++) {// Loop throuigh Array by index
            for (int y = 1; y < _numbersToProcess[x]; y++) {// Y is equal to less than index x
                _result[x] = _numbersToProcess[x] *= y;// Multiply x by y then add to array
            }
        }

        for (int n = 0; n < _result.Length; n++) {// Y is equal to less than index x
            Console.WriteLine(_result[n]);// Write to console
        }

        Console.ReadLine();

5 ответов


int _numbers = int.Parse(Console.ReadLine());// Get number of ints to calculate
    int[] _numbersToProcess = new int[_numbers];// Array of inputs
    int[] _result = new int[_numbers];
    int i = 0;

    while(i < _numbersToProcess.Length) {
        _numbersToProcess[i] = int.Parse(Console.ReadLine());
        i++;
    }

    for (int x = 0; x < _numbersToProcess.Length; x++)
        {// Loop throuigh Array by index
            int fact = 1;
            for (int y = 1; y <= _numbersToProcess[x]; y++)
            {// Y is equal to less than index x
                fact = fact*y;
            }
            _result[x] = fact;
        }


    for (int n = 0; n < _result.Length; n++) {// Y is equal to less than index x
        Console.WriteLine(_result[n]);// Write to console
    }

    Console.ReadLine();

проблема с вашим внутренним циклом for. здесь вы всегда переопределяете массив результатов.

i.e для y=5; внутренний цикл выполняется 5 раз.

iteration -1 : 
  y=1,
  _numbersToProcess[5]=5
  _result[x]=5

  iteration -2 : 
  y=2,
  _numbersToProcess[5]=10
  _result[x]=10

iteration -3 : 
  y=3,
  _numbersToProcess[5]=30
  _result[x]=30

.
.
.
.
.

таким образом, он идет на 12 итераций, поскольку ваш _numbertoprocess[5] изменяется и останавливается, как только он достигает менее 0 i.e -1899959296.

iteration 12:
  _numbertoprocess[5] = -1899959296.

Я.е вы меняете numbertoprocess каждый раз в своем внутреннем цикле for.

вы можете проверить это добавление

Console.WriteLine(y);
Console.WriteLine(_numbersToProcess[x]);
Console.WriteLine(_result[x]);

в вашем внутреннем цикле for.


for (int y = 1; y < _numbersToProcess[x]; y++) {// Y is equal to less than index x
    _result[x] = _numbersToProcess[x] *= y;// Multiply x by y then add to array
}

В условие цикла y < _numberToProcess[x];. Это сравнение между y и _numberToProcess[x] массив значений

Я думаю, вы должны отредактировать условие цикла до y < x

повезет.


здесь я использую рекурсивную факториальную функцию

      /* Factorial function*/
            int factorial (int n)
            {
            return (n*factorial(n-1))
            }

          int _numbers = int.Parse(Console.ReadLine());// Get number of ints to calculate
                    int[] _numbersToProcess = new int[_numbers];// Array of inputs
                    int[] _result = new int[_numbers];
                    int i = 0;

                    while(i < _numbersToProcess.Length) {
                        _numbersToProcess[i] = int.Parse(Console.ReadLine());
                        i++;
                    }

                    for(int x = 0; x < _numbersToProcess.Length; x++) {// Loop throuigh Array by index

                            _result[x] = factorial(_result[x])// Multiply x by y then add to array
                        }
                    }

                    for (int n = 0; n < _result.Length; n++) {// Y is equal to less than index x
                        Console.WriteLine(_result[n]);// Write to console
                    }

                    Console.ReadLine();

#include <stdio.h>

int main()
{
  int c, n, fact = 1;

  printf("Enter a number to calculate it's factorial\n");
  scanf("%d", &n);

  for (c = 1; c <= n; c++)
    fact = fact * c;

  printf("Factorial of %d = %d\n", n, fact);

  return 0;
}

проверьте это, возможно, это поможет...

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

long f(int n) {
    if (n==0) return 1;
    else return n * f(n-1);
}

int main(int argc, char *argv[]) {
    long *factorials;
    int *inputs;
        int n;

    printf("Enter number n = ");
    scanf("%d", &n);

    factorials = (long *) malloc(n*sizeof(long));
    inputs = (int *) malloc(n*sizeof(int));

    for (int i = 0; i < n; i++) {
        long k;
        printf("Enter %d number = ", i + 1);
        scanf("%ld", &k);
        inputs[i] = k;
        factorials[i] = f(k);
    }

    for (int i = 0; i < n; i++) {
        printf("Factorial for %d = %ld\n", inputs[i], factorials[i]);
    }

    return 0;
}