计算阶乘程序

 收藏

大家好,我有任务“编写一个针对给定的N和K(1

using System;

class NandKFactorials
{
    public static double fact(double x)
    {

        double result = 1;
        for (int i = 1; i <= x; i++)
            result *= i;
        return result;
    }


    public static double calculating(double n, double k)
    {
        return fact(n) / fact(k);
    }

    static void Main()
    {

        Console.WriteLine(calculating(5,6));

    }
}
回复
  • lsunt 回复

    首先,您尚未证明该值在要求的规格范围内

    通常,如果赋值表明变量将在给定范围内,我认为这意味着您可以假定它会在某个范围内,而不必验证它。

    第二,您使用double似乎是您自动使用它,但不理解它的含义....因为您未能使值i成为doubl

    我认为可以肯定地假设n和k的值(以及i的可能值)将处于int范围内(如果不存在,您将等待很长一段时间才能让该函数返回),而结果可能不是。

    if ( x > 1 )
        return x * fact( x - 1 )
    else
        return double(1)
    

    请不要建议使用递归来计算阶乘。它比使用循环效率低,并且可能导致大参数的堆栈溢出。

  • 汪昭昭 回复

    喜欢sepp2k响应...

    您说的是“程序”

    “编写一个程序,为给定的N和K(1

    所以我认为这意味着您所拥有的只是简单的子例程,而这只是一种方法(对于C-可能就足够了),但是我认为并没有显示出足够的...

    但是我以不同的方式看待它,并注意到了一些遗漏的地方

    首先,您尚未证明该值在要求的规格范围内

    对于给定的N和K(1

    第二,您使用double似乎是您自动使用它,但可能无法理解它的含义....,因为您未能使i成为double值

    这意味着如果它们大于整数最大大小,则会在达到N或K值之前导致错误

    以及如果N&K的值大于double max size怎么办

    您的测试样本也很简单,但我希望您能扩展以显示规格...

    即如果您做了(6,5)会发生什么...或(-5 * 10 ** 4,5 * 10 ** 100),该怎么办?

    黑匣子测试将显示您了解该过程,而不仅仅是克隆书中的示例...

    我们的主要问题是,我们不知道您正在在什么水平的数学和程序上进行……有很多方法可以解决这个问题……

    双重结果= 1;   对于(int i = 1; i <= x; i ++)   结果* = i;   返回结果;
    if ( x > 1  )
      return x * fact( x - 1 )   
    else
      return double(1)
    

  • uaut 回复

    这可能不是您的教师正在寻找的解决方案。我想您的老师正在寻找一个解决方案,您可以计算n!/ k!不计算n!。

    请注意,如果您展开n!/ k !,它将如下所示:

    1 * 2 * ... * n
    --------------------------
    1 * 2 * ... * n *  ... * k
    

    See how the 1 * 2 * ... * n part repeats in both the numerator and the denominator? If you were to calculate this by hand, you wouldn't calculate that part, right? You'd just cancel it out and only calculate the part that doesn't repeat. I imagine your program is suppsed to do the same.

    这不仅会导致运行时间更长,而且对于较大的n和k会减少舍入误差。