Вернуть первый идеальный квадрат, который больше, чем его целочисленный аргумент - PullRequest
0 голосов
/ 14 мая 2011

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

3 голосов
/ 14 мая 2011

Базовое решение выглядит хорошо.Возможно, вы захотите рассмотреть:

  • Следует ли добавлять комментарии к этой функции?Возможно, не для экзамена, но стоит подумать.
  • Используйте согласованный регистр для ваших параметров / локальных переменных.Подумайте, можно ли назвать их более четко.
  • А как насчет граничных условий?Вы рассмотрели отрицательный случай, но что если inputNumber близок к int.MaxValue, так что следующий идеальный квадрат будет> MaxValue?
1 голос
/ 14 мая 2011

Кажется, работает правильно.

Я бы лично пошел на что-то вроде:

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

так как я думаю, что логика немного яснее. Но это могут быть мои личные предпочтения, конечно;)

1 голос
/ 14 мая 2011

Вид.

Но я не хочу на этом останавливаться, потому что вы могли бы довольно легко это проверить, выполнив несколько тестов.

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 в качестве ввода)

1 голос
/ 14 мая 2011

Смотрит прямо на меня. Обрабатывает отрицательные числа, обрабатывает произвольное значение, которое не является идеальным квадратом, правильно обрабатывает идеальные квадраты, поэтому я пойду с да.

0 голосов
/ 01 августа 2015

Вы можете уменьшить свой код как

public static int NextPerfectSquare(int inputNumber)
{
    if (inputNumber < 0) return 0;
    var result = Math.Sqrt(inputNumber);
    var resultnumber = (int) result;
    resultnumber++;
    return resultnumber * resultnumber;

}
...