Question

Je dois écrire une fonction qui renvoie la première place parfaite supérieure à son argument entier.Un carré parfait est un entier égal à certains entier carré.Par exemple 16 est un carré parfait car 16= 4 * 4. Cependant 15 n'est pas un carré parfait car il n'y a pas d'entier N tel que 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;

}

est-ce correct?

Était-ce utile?

La solution

La solution de base a l'air bien.Vous voudrez peut-être envisager:

  • Les commentaires doivent-ils être ajoutés à cette fonction?Peut-être pas pour un examen, mais la peine d'être considérée.
  • Utilisez un boîtier cohérent pour vos paramètres / variables locales.Examiner si elles pourraient être nommées plus clairement.
  • Qu'en est-il des conditions de frontière?Vous avez le cas négatif couvert, mais si l'InputNumber est proche de Int.MaxValue afin que le prochain carré parfait serait> Maxvalue?

Autres conseils

regarde juste pour moi.Gère des nombres négatifs, gère une certaine valeur arbitraire qui n'est pas une carré parfaite correctement, gère correctement les carrés parfaites, donc je vais aller avec Oui.

genre de.

Mais je suis détesté de le laisser à cela parce que vous auriez pu vérifier cela vous-même assez facilement en exécutant des 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

Vous pouvez donc probablement l'optimiser un peu pour des points bonus?

Rendez-le en sécurité pour les grands nombres.I.e. Long / intT64

Faites-la en sécurité des débordements maximaux de la valeur.(essayez d'entrer int.maxvalue comme votre entrée)

semble fonctionner correctement.

Je vais personnellement aller pour quelque chose comme:

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

Comme je pense qu'il montre la logique un peu plus claire.Mais cela pourrait être mes préférences personnelles bien sûr;)

Vous pouvez réduire votre code comme

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

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top