for循环中N个数的阶乘
Factorial(s) of N numbers in for loop
我正在处理 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
}
}
外循环定义要执行多少计算。
内部循环通过遍历 _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();
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 循环上。在这里,您总是覆盖结果数组。
即y=5;
内部for循环执行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 时停止,即 -1899959296。
iteration 12:
_numbertoprocess[5] = -1899959296.
即 你每次都在内部 for 循环中更改 numbertoprocess。
你可以通过添加
来验证
Console.WriteLine(y);
Console.WriteLine(_numbersToProcess[x]);
Console.WriteLine(_result[x]);
在你的内部 for 循环中。
#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;
}
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>
#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;
}
我正在处理 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
}
}
外循环定义要执行多少计算。
内部循环通过遍历 _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();
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 循环上。在这里,您总是覆盖结果数组。
即y=5; 内部for循环执行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 时停止,即 -1899959296。
iteration 12:
_numbertoprocess[5] = -1899959296.
即 你每次都在内部 for 循环中更改 numbertoprocess。
你可以通过添加
来验证Console.WriteLine(y);
Console.WriteLine(_numbersToProcess[x]);
Console.WriteLine(_result[x]);
在你的内部 for 循环中。
#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;
}
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>
#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;
}