【问题标题】:Return the first perfect square that is greater than its integer argument返回大于其整数参数的第一个完全平方
【发布时间】:2011-08-25 14:19:42
【问题描述】:

我需要编写一个函数来返回大于其整数参数的第一个完美平方。完美平方是等于某个整数平方的整数。例如,16 是一个完美的正方形,因为 16 = 4 * 4。但是 15 不是一个完美的正方形,因为没有整数 n 使得 15 = n*n。

public static int NextPerfectSquare(int inputNumber)
{
    if (inputNumber < 0) return 0;
    inputNumber++;
    var result = Math.Sqrt(inputNumber);
    var resultnumber = (int) result;
    if (resultnumber == result) return inputNumber;
    resultnumber++;
    return resultnumber * resultnumber;

}

是这样吗?

【问题讨论】:

  • 你现在在考试吗?
  • 你能解释一下“if (resultnumber == result)...”这一行的含义吗?您正在比较 double 和 int。
  • 是的,我太困惑了,我认为如果 (resultnumber == result) return inputNumber;??? 不需要这些行并且返回 inputNumber 违反了返回完美正方形???

标签: c# .net perfect-square


【解决方案1】:

您可以将代码减少为

public static int NextPerfectSquare(int inputNumber)
{
    if (inputNumber < 0) return 0;
    var result = Math.Sqrt(inputNumber);
    var resultnumber = (int) result;
    resultnumber++;
    return resultnumber * resultnumber;

}

【讨论】:

    【解决方案2】:

    似乎工作正常。

    我个人会选择类似的东西:

    public static int Next(int inputNumber)
    {
        if (inputNumber < 0) return 0;
    
        int perfectWidth = (int)Math.Floor(Math.Sqrt(inputNumber));
        return (int)Math.Pow(perfectWidth + 1, 2);
    }
    

    我认为它更清楚地显示了逻辑。但这当然可能是我个人的喜好;)

    【讨论】:

      【解决方案3】:

      有点。

      但我不想把它留在那里,因为您可以通过运行一些测试很容易地自己验证这一点。

      System.Console.WriteLine("-10 => {0}", NextPerfectSquare(-10));
      System.Console.WriteLine("0 => {0}", NextPerfectSquare(0));
      System.Console.WriteLine("1 => {0}", NextPerfectSquare(1));
      System.Console.WriteLine("15 => {0}", NextPerfectSquare(15));
      System.Console.WriteLine("21 => {0}", NextPerfectSquare(21));
      System.Console.WriteLine("24 => {0}", NextPerfectSquare(24));
      System.Console.WriteLine("36 => {0}", NextPerfectSquare(36));
      System.Console.WriteLine("Max => {0}", NextPerfectSquare(int.MaxValue));
      System.Console.WriteLine("Min => {0}", NextPerfectSquare(int.MinValue));
      
      -10 => 0
      0 => 1
      1 => 4
      15 => 16
      21 => 25
      24 => 25
      36 => 49
      Max => 1
      Min => 0
      

      所以你可以稍微优化一下以获得奖励积分?

      确保大量数据的安全。即 long/Int64

      使其免受最大值溢出的影响。 (尝试输入 int.MaxValue 作为您的输入)

      【讨论】:

        【解决方案4】:

        基本解决方案看起来不错。您可能需要考虑:

        • 是否应将 cmets 添加到此函数中?也许不是为了考试,但值得考虑。
        • 对参数/局部变量使用一致的大小写。考虑是否可以更清楚地命名它们。
        • 边界条件呢?您已经涵盖了否定的情况,但是如果 inputNumber 接近 int.MaxValue 以使下一个完美平方将 > MaxValue 怎么办?

        【讨论】:

          【解决方案5】:

          在我看来是正确的。处理负数,处理一些不是完全平方的任意值,正确处理完全平方,所以我会选择是的。

          【讨论】:

            猜你喜欢
            • 2011-01-04
            • 2015-12-12
            • 2014-10-31
            • 2021-12-15
            • 2016-07-27
            • 2021-04-08
            • 1970-01-01
            • 1970-01-01
            • 2023-01-24
            相关资源
            最近更新 更多