-1

我需要编写一个函数来返回大于其整数参数的第一个完美平方。完美平方是等于某个整数平方的整数。例如,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;

}

这是正确的吗?

4

5 回答 5

3

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

  • 是否应该在此函数中添加注释?也许不是为了考试,但值得考虑。
  • 为您的参数/局部变量使用一致的大小写。考虑是否可以更清楚地命名它们。
  • 边界条件呢?您已经涵盖了否定的情况,但是如果 inputNumber 接近 int.MaxValue 以使下一个完美的平方大于 MaxValue 怎么办?
于 2011-05-14T17:21:25.930 回答
1

在我看来是对的。处理负数,处理一些不是完美正方形的任意值,正确处理完美正方形,所以我会选择“是”。

于 2011-05-14T17:20:47.860 回答
1

有点儿。

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

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

因此,您可能可以对其进行一些优化以获得奖励积分?

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

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

于 2011-05-14T17:22:40.883 回答
1

似乎工作正常。

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

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);
}

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

于 2011-05-14T17:50:09.837 回答
0

您可以将代码减少为

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

}
于 2015-08-01T14:55:32.930 回答