C# 计算阶乘

3
我有一段代码,从用户那里获取输入并计算其阶乘以及小于输入数字的阶乘,但我一直只得到第一个数字的阶乘,而其他的数字都是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--;
            }
        }
    }
}

5
那么,你有问题吗? - Soner Gönül
2
还不太清楚。你的问题是什么? - Vano Maisuradze
2
在调试器中运行它,检查变量,问题应该很明显... - Willem van Rumpt
n = num; // 将 n 赋值为 num 放在 while 循环内部。 - Eric
请不要点踩,这位朋友有一个对他来说很重要的问题。 - Rafa
显示剩余5条评论
7个回答

8
您已经包括了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 添加到新类的顶部,更重要的是,在创建控制台应用程序时也会添加。 - user585968
这对于它所完成的任务来说非常慢且复杂。 - jamie yello

7
现在回答你的问题,你已经发布了它:
我的问题是如何使循环遍历输入数字以下的所有数字?
使用循环
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; 

证明: int input = 4; int result = 1; for(int i = input; i > 0; i--) result *= i;
Console.WriteLine("Result=" + result);

输出: 24

更好的方法——使用递归

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

因此,调用Factorial(5)将得到120等结果。


1
显然,这并没有回答问题,但却得到了所有的投票。 - Eric
1
现在是这样的,我在 OP 实际发布问题之前就回答了 Eric 的问题。他的帖子只是“这里有代码”。 - Alex Anderson
答案就像Eric所说的那样:只需将n=num;移动到while循环内部即可解决问题。(已解决) - Ahmad Khalil
1
两件事。首先,验证应该是如果小于2。其次,使用长整型而不是整型。例如,对于阶乘(13),它返回一个不正确的值。 - Sith2021
递归并不是一种更好的方式,当存在迭代方法时。 - Zar Shardan
给未来的读者,不要按照Alex所说的去做。如果原帖没有提出问题,请标记为需要澄清并继续前进。不要猜测。 - Marie

6
只需将 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--;
}

1
有时候,“最简单”的解决方案“是最好的”。+1 - user585968

2

有两个要点;

将你的int i = n - 1改为int i = num,并在for循环之前将n赋值为1

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


2

作为一个定义,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);

3
如果追求简短而不是效率的话,那么技术上讲 Enumerable.Range(1,++i).Aggregate((f,x)=>f*x)/i; 更短。但请永远不要这样做。 - Hod - Monica's Army

0

你可以使用递归函数来计算阶乘,示例代码如下:

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

-1

这是我用来计算阶乘的代码片段

ulong GetFactorialResult(ulong number)
{
    if (number > 0 && number != 1)
    {
        checked
        {
            return (number * (number - 1)) * GetFactorialResult(number - 2);
        }
    }
    else
    {
        return 1;
    }
}

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接