Вернуть первый идеальный квадрат, который больше целочисленного аргумента

Мне нужно написать функцию, которая возвращает первый идеальный квадрат, который больше, чем его целочисленный аргумент. Идеальный квадрат - это целое число, равное некоторому целому квадрату. Например, 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;

}
Другие вопросы по тегам