当前位置: 首页 > 知识库问答 >
问题:

for循环中N个数的阶乘

晏正豪
2023-03-14

我正在研究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;

这显然与<\u numbersToProcess[x]=u 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();

共有3个答案

笪栋
2023-03-14

这里我使用递归函数阶乘

      /* 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();
公孙宏畅
2023-03-14
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

我认为您应该将循环条件编辑为y

祝你好运。

花飞尘
2023-03-14
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;内部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

.
.
.
.
.

因此,当您的_numbertoprocess[5]发生变化时,它会进行12次迭代,一旦它小于0即-1899959296就会停止。

iteration 12:
  _numbertoprocess[5] = -1899959296.

i、 每次在你的内部for循环中,你都在改变numbertoprocess。

您可以通过添加

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

在你内心的循环中。

 类似资料:
  • 问题内容: 这两种获取阶乘(循环与递归)的方法中哪种更有效/更快?如果可以改进,那又如何呢? 语言:Java 问题答案: 因为没有方法调用的开销,所以for循环将更加有效。(作为一般规则,循环几乎总是比递归更有效率) 为了解释为什么您必须深入了解调用方法和调用堆栈时发生的事情。 基本上,当您调用一个方法时,它需要一些空间来使用(例如其局部变量之类的东西),它还需要空间以用于将传入的参数传递给它,并

  • 问题内容: 在下面的示例代码中,是否真的需要counter = 0,还是有更好,更多的Python方法来访问循环计数器?我看到了一些与循环计数器有关的PEP,但它们要么被延迟要么被拒绝(PEP 212 和PEP 281)。 这是我的问题的简化示例。在我的实际应用程序中,这是通过图形完成的,整个菜单必须每帧重新绘制一次。但这以易于复制的简单文本方式进行了演示。 也许我还应该补充一点,我正在使用Pyt

  • 我遇到了一个相当奇怪的问题,当我试图编码我的机器人的一个特定的部分!为了使其简单简短,我有一个包含各种属性的对象数组(参见代码中的示例)。我想要做的是获取数组中的所有特定属性(例如name)并将其打印到控制台中。我尝试使用一个简单的for循环进行循环,每一个成功的循环,我都要求控制台记录ArrayName[I].name!请参阅代码以获得澄清! 问题是它确实按预期记录了代码--例如,在本例中是Re

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 问题内容: 在遍历列表的Python循环中,我们可以编写: 并巧妙地遍历列表中的所有元素。有没有办法知道循环中到目前为止我循环了多少次?例如,我要列出一个清单,在处理完10个元素之后,我想对它们进行处理。 我考虑过的替代方案可能是: 要么: 是否有更好的方法(就像)来获得到目前为止的迭代次数? 问题答案: pythonic的方法是使用:

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码: