C#阶乘计算器无法正常工作

时间:2014-10-06 00:38:20

标签: c# math factorial

我的阶乘计算器工作不正常。

正如我的教授想要的那样,它的预期工作时间为1到20。但是,输入0应该返回1的阶乘;它返回0

这是我的代码:

        private void CalculateFactorial(long number)
    {
        //perform the calculations
        long result = number;
        for (int i = 1; i < number; i++)
        {
            result = result * i;
        }

        //display the calculated Factorial to the user
        txt_Factorial.Text = result.ToString("n0");
    }

以下是调用上述方法的方法,即计算按钮的事件处理程序:

private void btn_Calculate_Click(object sender, EventArgs e)
    {
        //get the users input
        long number = long.Parse(txt_Number.Text);

        // make sure the number not invalid. If it is invalid, tell the user
        // otherwise, proceed to calculation. 
        if (number < 0 || number > 20)
            txt_Factorial.Text = "Invalid Number";
        else
            CalculateFactorial(number);
        txt_Number.Focus(); // returns the focus to the number box whether or not data was valid

想法?

4 个答案:

答案 0 :(得分:10)

如果您在调试器中逐步执行此操作,则问题会变得非常清楚。而且,由于您刚开始编程,我强烈建议尽早使用调试器。它是一个绝对宝贵的编程工具。

查看您的for循环:

for (int i = 1; i < number; i++)

number 0时会发生什么?循环永远不会运行。您不能在循环范围中包含0,因为这会将每个结果设置为0,方法是先将其乘以0。因此,您需要在函数逻辑中添加0的显式检查:

if (number == 0)
    return 1;
// continue with your loop here

答案 1 :(得分:2)

因为0的因子是1,而不是通过计算,你的代码没有反映出来。在代码前添加一个检查:

if (number == 0)
    result = 1;
else 
    // compute factorial

另外考虑创建一个返回整数值的函数作为结果。

答案 2 :(得分:0)

您可以使用:

if(number == 0){
    result = 1;
}
for (int i = 1; i <= number; i++)
    result *=  i;
}

您的公式也是错误的,因为n! = 1*2*3*.....*n

答案 3 :(得分:0)

您可以测试以下代码!测试和工作。递归实现以及基本实现

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

namespace ConsoleApplication50
{
    class Program
    {
        static void Main(string[] args)
        {

        NumberManipulator manipulator = new NumberManipulator();
        Console.WriteLine("Please Enter Factorial Number:");
        int a= Convert.ToInt32(Console.ReadLine());

        Console.WriteLine("---Basic Calling--");
        Console.WriteLine("Factorial of {0} is: {1}" ,a, manipulator.factorial(a));

        Console.WriteLine("--Recursively Calling--");
        Console.WriteLine("Factorial of {0} is: {1}", a, manipulator.recursively(a));

        Console.ReadLine();
    }
}

class NumberManipulator
{
    public int factorial(int num)
    {
        int result=1;
        int b = 1;
        do
        {
            result = result * b;
            Console.WriteLine(result);
            b++;
        } while (num >= b);
        return result;
    }

    public int recursively(int num)
    {
        if (num <= 1)
        {
            return 1;
        }
        else
        {
            return recursively(num - 1) * num;
        }
    }
  }
}