我有这个代码从用户获取输入并计算其阶乘和因子小于输入数字,但我继续获得第一个数字的阶乘,其余为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--;
}
}
}
}
答案 0 :(得分:2)
现在回答你问题你已经实际发布了它:
我的问题是如何让循环抛出输入数字下方的所有数字?
有一个循环
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--) 结果* = 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等的结果。
答案 1 :(得分:1)
两件事;
将您的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 :(得分:1)
移动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--;
}
答案 3 :(得分:1)
您已加入System.Linq
,因此我提出了Linq
解决方案:
int n = 5;
// result == 120
int result = Enumerable.Range(1, n).Aggregate(1, (p, item) => p * item);
但是,Linq 过冲,而 for loop 更具可读性。打印出所有行:
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);
答案 4 :(得分:1)
定义为0! == 1.从最短到最聪明,有几种方法可以解决这个问题,所以您可以得到以下顺序:1,1,2,6,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);