我有这段代码,它从用户那里获取输入并计算其阶乘和小于输入数字的阶乘,但我一直只获取第一个数字的阶乘,其余为 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--;
}
}
}
}
您已包含
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);
现在回答您的问题,您实际上已经发布了它:
我的问题是如何让循环抛出输入数字下面的所有数字?
带循环
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
使用回避的更好方法
public int Factorial(int f)
{
if(f == 0)
return 1;
else
return f * Factorial(f-1);
}
因此调用 Factorial(5) 会得到 120 等结果。
只需将
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--;
}
有两件事;
将
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
作为定义,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);
可以使用递归函数进行阶乘计算 示例代码是:
public static int fak(int number)
{
if(number==1)
{
return 1;
}
else
{
return number*(fak(number-1));
}
}
Console.WriteLine("Enter a value n>=0");
int UserInput=int.Parse(Console.ReadLine());
int factorial = 1;
for (int i = 1; i <= UserInput; i++)
{
factorial *= i;//factorial=factorial * i
}
Console.WriteLine(factorial);
这是我用于阶乘计算的代码片段
ulong GetFactorialResult(ulong number)
{
if (number > 0 && number != 1)
{
checked
{
return (number * (number - 1)) * GetFactorialResult(number - 2);
}
}
else
{
return 1;
}
}