C#计算析因?

时间:2015-03-13 07:35:39

标签: c#

我有这个代码从用户获取输入并计算其阶乘和因子小于输入数字,但我继续获得第一个数字的阶乘,其余为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 个答案:

答案 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);