Факториал(ы) из 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;
}