我需要编写一个返回第一个完整正方形的函数,该正方形大于整数参数。完美平方是一个等于某个整数平方的整数。例如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;
}
这是对的吗?
答案 0 :(得分:3)
基本解决方案看起来不错。您可能需要考虑:
答案 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;
}