【问题标题】:C# to calculate factorialC# 计算阶乘
【发布时间】:2015-03-13 07:35:38
【问题描述】:

我有这段代码从用户那里获取输入并计算其阶乘和小于输入数的阶乘,但我一直只获取第一个数字的阶乘,其余为 0。应该是这样的:例如,如果输入是5:

5! = 120

4! = 24

3! = 6

2! = 4

1! = 1

如何让循环抛出输入数字下方的所有数字?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace multiple_factorials
{
    class Program
    {
        static void Main(string[] args)
        {
            int num, n;

            Console.WriteLine(".....................[Application 1].....................\n\n");
            Console.WriteLine("Please enter a number to get its factorial: ");
            num = Convert.ToInt32(Console.ReadLine());

            n = num; // Assign n to num

            while (num > 0)
            {
                for (int i = n - 1; i > 0; i--)
                {
                   n *= i;
                }
                Console.WriteLine("Factorial of {0}! = {1}\n", num, n);
                num--;
            }
        }
    }
}

【问题讨论】:

  • 那么,您有问题吗?
  • 已编辑抱歉我忘记了问题
  • 还不清楚。你的问题是什么? (在句末使用“?”符号)
  • 在调试器中运行它,检查变量,应该清楚问题是什么......
  • n = num; // assign n to num放在while循环里面

标签: c# factorial


【解决方案1】:

你已经包含了System.Linq,所以我提出了一个 LINQ 解决方案:

 int n = 5;

 // result == 120
 int result = Enumerable.Range(1, n).Aggregate(1, (p, item) => p * item);

不过,LINQ 在这里矫枉过正for 循环 更具可读性。打印所有行:

int num = 5;

String result = String.Join(Environment.NewLine,
  Enumerable.Range(1, num)
    .Reverse()
    .Select((index) =>
      String.Format("Factorial of {0}! = {1}\n",
                    index,
                    Enumerable.Range(1, index).Aggregate(1, (p, item) => p * item))));

Console.Write(result);

【讨论】:

  • “你已经包含了 System.Linq,所以我放了一个 LINQ 解决方案:” - 你知道 Visual Studio 会自动将 using System.Linq 添加到新的顶部类,更重要的是创建 控制台应用
【解决方案2】:

只需将n = num; 移动到while 循环内:

while (num > 0)
{
    n = num;
    for (int i = n - 1; i > 0; i--)
    {
        n *= i;
    }
    Console.WriteLine("Factorial of {0}! = {1}\n", num, n);
    num--;
}

【讨论】:

  • 有时simplest 解决方案are the best。 +1
【解决方案3】:

现在回答你的问题,你实际上已经发布了:

我的问题是如何让循环抛出输入数字下方的所有数字?

有一个循环

for(int i = input; i > 0; i--)

将从输入(比如说 5)倒计时到 1 {5, 4, 3, 2, 1}

然后你只需相乘

int result = 1;
for(int i = input; i > 0; i--) 
    result *= i; 

证明: 整数输入 = 4; 整数结果 = 1; for(int i = 输入; i > 0; i--) 结果 *= 我;

Console.WriteLine("Result=" + result);

输出:24

使用 Recusion 的更好方法

public int Factorial(int f)
{
    if(f == 0)
        return 1;
    else
        return f * Factorial(f-1); 
}

所以调用 Factorial(5) 会得到 120 等的结果。

【讨论】:

  • 显然这并没有回答问题,而是得到了所有的选票
  • 现在可以了,埃里克,我在 OP 实际发布问题之前回答了。他的 OP 只是“这里是代码”。
  • 答案正如埃里克所说:只需移动 n=num;在while循环内,它可以工作。 (已解决)
  • 两件事。首先,验证应该是是否小于 2。其次,使用 long 而不是 int。例如,对于 Factorial (13),它返回一个不正确的值。
【解决方案4】:

作为定义,0! == 1.有几种方法可以解决这个问题,从最短到最聪明,这样你就得到了序列:1、1、2、6、24、120...我认为Linq给出了最短/最干净的代码。

int f(i) => Enumerable.Range(1,i<1?1:i).Aggregate((f,x)=>f*x);

其他替代品,虽然不太干净,但会是:

int f(i) => Enumerable.Range(1,Math.Max(1,i).Aggregate((f,x)=>f*x);

int f(i) => Enumerable.Range(1,i+(int)Math.Pow(0,i)).Aggregate((f,x)=>f*x);

【讨论】:

  • 我的意思是,如果简洁胜过性能是目标,那么 技术上 Enumerable.Range(1,++i).Aggregate((f,x)=&gt;f*x)/i; 会更短。 (请永远不要这样做)。
【解决方案5】:

两件事;

将您的 int i = n - 1 更改为 int i = num 并将您的 n 分配给 1,就在您的 for 循环之前。

while (num > 0)
{
     n = 1;
     for (int i = num; i > 0; i--)
     {                    
           n *= i;
     }           
     Console.WriteLine("Factorial of {0}! = {1}\n", num, n);
     num--;
}

结果会是;

请输入一个数字以获取其阶乘 5

5 的因数! = 120

4 的因数! = 24

3 的因数! = 6

2 的因数! = 2

1 的因数! = 1

【讨论】:

    【解决方案6】:

    您可以使用递归函数进行阶乘计算 示例代码是:

    public static int  fak(int number)
    {
        if(number==1)
        {
            return 1;
        }
        else
        {
            return number*(fak(number-1));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2023-03-22
      • 2015-01-08
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多