返回大于其整数参数的第一个完美正方形

时间:2011-05-14 17:09:26

标签: c# .net perfect-square

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

}

这是对的吗?

5 个答案:

答案 0 :(得分:3)

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

  • 是否应将评论添加到此功能?也许不是考试,但值得考虑。
  • 为参数/局部变量使用一致的套管。考虑一下他们是否可以更清楚地命名。
  • 边界条件怎么样?你已经覆盖了负面情况,但是如果inputNumber接近int.MaxValue,那么下一个完美正方形将是&gt; MaxValue的?

答案 1 :(得分:1)

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

答案 2 :(得分: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

所以你可以为奖励积分稍微优化一下吗?

使大数字安全。即long / Int64

确保最大值溢出安全。 (尝试输入int.MaxValue作为输入)

答案 3 :(得分: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);
}

因为我认为它显示逻辑更清晰一点。但这当然可能是我个人的偏好;)

答案 4 :(得分: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;

}