-1

I need to write a function that returns the first perfect square that is greater than its integer argument. A perfect square is an integer that is equal to some integer squared. For example 16 is a perfect square because 16 = 4 * 4. However 15 is not a perfect square because there is no integer n such that 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;

}

Is this right?

DanM7
  • 2,203
  • 3
  • 28
  • 46
Maged Samaan
  • 1,742
  • 2
  • 19
  • 39
  • 12
    Are you in the exam right now? – Darin Dimitrov May 14 '11 at 17:15
  • Could you clarify the meaning of a line "if (resultnumber == result)..."? You are comparing double and int. –  May 14 '11 at 18:43
  • yeah i am too confused i think there is no need of these line if (resultnumber == result) return inputNumber;??? and returning inputNumber violates returning perfect square??? – LC 웃 Aug 01 '15 at 14:49

5 Answers5

3

The basic solution looks good. You may want to consider:

  • Should comments be added to this function? Maybe not for an exam, but worth considering.
  • Use consistent casing for your parameters/local variables. Consider whether they could be named more clearly.
  • What about boundary conditions? You've got the negative case covered, but what if inputNumber is close to int.MaxValue so that the next perfect square would be > MaxValue?
Colin Thomsen
  • 1,806
  • 15
  • 11
1

Looks right to me. Handles negative numbers, handles some arbitrary value which is not a perfect square properly, handles perfect squares properly, so I'll go with yes.

zellio
  • 31,308
  • 1
  • 42
  • 61
1

Kind of.

But I'm loathe to leave it at that because you could have verified this yourself quite easily by running some tests.

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

So you could probably optimize it a little for bonus points?

Make it safe for large numbers. i.e. long/Int64

Make it safe from max value overflows. (try entering int.MaxValue as your input)

Eoin Campbell
  • 43,500
  • 17
  • 101
  • 157
1

Seems to be working correct.

I would personally go for something like:

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

as i think it shows the logic a bit clearer. But that might be my personal preferences of course ;)

Jan-Peter Vos
  • 3,157
  • 1
  • 18
  • 21
0

You can reduce your code as

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

}