2011-05-14 63 views
-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; 

} 

这是正确的吗?

+12

你在考试的权利吗? – 2011-05-14 17:15:09

+0

你能否澄清一行“if(resultnumber == result)...”的含义?你正在比较double和int。 – 2011-05-14 18:43:33

+0

是啊我太困惑了,我认为没有这些行的需要if(resultnumber == result)return inputNumber; ???并返回inputNumber违反返回完美的方形? – 2015-08-01 14:49:28

回答

3

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

  • 应该在该功能中添加注释吗?也许不适合参加考试,但值得考虑。
  • 对参数/局部变量使用一致的套管。考虑他们是否可以更清楚地命名。
  • 边界条件如何?你已经覆盖了负面情况,但是如果inputNumber接近于int.MaxValue,那么下一个完美正方形将> MaxValue?
+0

为什么他需要这个if(resultnumber == result)return inputNumber; ??? – 2015-08-01 14:52:38

1

看起来很对我。处理负数,处理一些任意值,这不是一个完美的正方形,恰当地处理完美的正方形,所以我会选择是的。

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作为输入)

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

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

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; 

} 
相关问题