Вернуть первый идеальный квадрат, который больше целочисленного аргумента
Мне нужно написать функцию, которая возвращает первый идеальный квадрат, который больше, чем его целочисленный аргумент. Идеальный квадрат - это целое число, равное некоторому целому квадрату. Например, 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 ответов
Базовое решение выглядит хорошо. Вы можете рассмотреть:
- Следует ли добавлять комментарии к этой функции? Может быть, не для экзамена, но стоит задуматься.
- Используйте согласованный регистр для ваших параметров / локальных переменных. Подумайте, можно ли назвать их более четко.
- Как насчет граничных условий? Вы рассмотрели отрицательный случай, но что если inputNumber близок к int.MaxValue, так что следующий идеальный квадрат будет> MaxValue?
Кажется, работает правильно.
Я бы лично пошел на что-то вроде:
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);
}
поскольку я думаю, что это показывает логику немного яснее. Но это может быть моим личным предпочтением, конечно;)
Вид.
Но я не хочу на этом останавливаться, потому что вы могли бы довольно легко это проверить, выполнив несколько тестов.
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 в качестве ввода)
Смотрится прямо на меня. Обрабатывает отрицательные числа, обрабатывает произвольное значение, которое не является идеальным квадратом, правильно обрабатывает идеальные квадраты, так что я пойду с да.
Вы можете уменьшить свой код как
public static int NextPerfectSquare(int inputNumber)
{
if (inputNumber < 0) return 0;
var result = Math.Sqrt(inputNumber);
var resultnumber = (int) result;
resultnumber++;
return resultnumber * resultnumber;
}