2009-10-10 10 views
1

J'ai ce code python:carré parfait

def sqrt(x): 
    ans = 0 
    if x >= 0: 
     while ans*ans < x: 
      ans = ans + 1 
      if ans*ans != x: 
       print x, 'is not a perfect square.' 
       return None 
      else: 
       print x, ' is a perfect square.' 
       return ans 
    else: 
     print x, ' is not a positive number.' 
     return None 

y = 16  
sqrt(y) 

la sortie est:

16 is not a perfect square. 

Alors que cela fonctionne parfaitement:

x = 16 
ans = 0 
if x >= 0: 
    while ans*ans < x: 
     ans = ans + 1 
     #print 'ans =', ans 
    if ans*ans != x: 
     print x, 'is not a perfect square' 
    else: print ans, 'is a perfect square' 
else: print x, 'is not a positive number' 

Qu'est-ce que je fais mal?

+1

Voici une question connexe sur la façon de déterminer si un nombre est un carré parfait: http: // stackoverflow.com/questions/295579/le plus rapide-pour-déterminer-si-un-nombre-entier-racine-est-un-entier –

Répondre

7

votre code correctement Indentation de laisser l'instruction while exécuter jusqu'à ans*ans < x:

def sqrt(x): 
    ans = 0 
    if x >= 0: 
     while ans*ans < x: 
      ans = ans + 1 

     if ans*ans != x: # this if statement was nested inside the while 
      print x, 'is not a perfect square.' 
      return None 
     else: 
      print x, ' is a perfect square.' 
      return ans 
    else: 
     print x, ' is not a positive number.' 
     return None 

y = 16   
print sqrt(y) 

Essayes here.

+0

Aah! Je devenais fou sur ceci, l'indentation alors que vraiment aide à lire le code peut être vraiment difficile à déboguer! :) – 3zzy

+2

Donnez-moi les règles d'indentation de Python un jour sur la possibilité que mon indentation ne correspond pas à mes accolades dans C et al. C'est beaucoup plus facile si vous vous assurez que votre éditeur est configuré uniquement pour les espaces. – paxdiablo

0

EDIT Je l'ai modifié, essayé, et cela fonctionne. Vous avez juste besoin de ce morceau de code

Dès que ans = 4, ans * ans n'est plus plus petit que x. Essayez tout ans * ans < = x: au lieu de simplement <

def sqrt(x): 
ans = 0 
if x >= 0: 
     while ans*ans <= x:      
       if ans*ans == x: 
          print x, ' is a perfect square.' 
          return ans 
     else: 
      ans = ans + 1 
+0

Essayé, toujours le même. – 3zzy

+0

Vous ne pouvez pas retourner dans votre boucle dans le cas où ans * ans n'est pas x. def sqrt (x): ans = 0 si x> = 0: tandis que * ANS ANS <= x: ans = ans + 1 si ans * ans == x: x impression, 'est un parfait carré.' return ans else: print x, 'n'est pas un nombre positif.' return Aucun \t print x, 'n'est pas un carré parfait.' retour Aucun \t y = 16 sqrt (y) – ManicMailman

+0

+ une impression « pas carrée » après le temps pour faire bien .. – stiank81

1

Votre boucle while exécute une seule fois. Quelle que soit la branche à laquelle l'instruction if se trouve, la fonction entière sera immédiatement renvoyée.

+0

étrange! Le même code fonctionne en dehors de la fonction, pourquoi est-ce? – 3zzy

+0

Parce que la boucle en dehors de la fonction n'est pas quittée prématurément avec un retour. – paxdiablo

0

Modifiez votre code afin qu'il affiche la valeur ans ainsi que x, afin de pouvoir indiquer le nombre de fois que la boucle est exécutée.

+0

ermm.pouvez-vous s'il vous plaît poster le code modifié? Merci – 3zzy

+0

Je ne suis pas un programmeur python, mais je pourrais reconnaître le même problème que Greg Hewgill. – pavium

0

Si votre échantillon de code est effectivement correctement indentet le premier tour du while reviendra sur son premier tour - toujours. Donc toute valeur positive de x> 1 remplira les ans * ans = 1 * 1 = 1! = X, donnant "x n'est pas un carré parfait".

Vous avez fondamentalement besoin d'obtenir votre indentation correctement - comme vous le faites dans votre autre exemple. Encore une fois - si votre exemple de code ici est en fait correctement indenté. Essayez ceci:

def sqrt(x): 
    ans = 0 
    if x >= 0: 
     while ans*ans < x: 
      ans = ans + 1 

     if ans*ans != x: 
      print x, 'is not a perfect square.' 
      return None 
     else: 
      print x, ' is a perfect square.' 
      return ans 
    else: 
     print x, ' is not a positive number.' 
     return None 
-1

Si l'objectif est de déterminer si un nombre est un carré parfait, je pense que ce serait plus simple (et peut-être plus efficace) d'utiliser les fonctions intégrées de mathématiques, par exemple:

def is_perfect_square(n): 
    if not ((isinstance(n, int) or isinstance(n, long)) and (n >= 0)): 
    return False 
    else: 
    return math.sqrt(n) == math.trunc(math.sqrt(n)) 
+1

Cela renvoie True pour '(2 ** 64) - 1' - vous perdez la précision – bstpierre

+1

Pas de critique pertinente, en dépit d'être vrai. Ce n'est pas une pure page de maths, c'est un site de programmation. Vous ne pouvez même pas stocker des nombres irrationnels dans les ordinateurs. La précision n'est jamais infinie; C'est le point des ordinateurs et toute personne qui a fait toute la programmation le sait à l'avance. Ne vois pas une raison de critiquer. Des nombres aussi grands ne seront pas testés sauf par des mathématiciens qui ont probablement de meilleures notions et ne seront pas sur ce site. – CogitoErgoCogitoSum

10

Je pensais juste que je cotise une solution plus simple:

def is_square(n): 
    return sqrt(n).is_integer() 

Ceci est valable pour n < 2**52 + 2**27 = 4503599761588224.

Exemples:

>>> is_square(4) 
True 
>>> is_square(123) 
False 
>>> is_square(123123123432**2) 
True 
+0

Bien qu'une bonne réponse pour les * petites * valeurs, cela a des problèmes de précision. 'is_square (123456789123456789 ** 7-1)' donne 'True'. Cependant, il n'y a pas de solution particulièrement facile. [Je ne pense pas que 123123123432156156165 ** 7 est carré de toute façon.] (Http://www.wolframalpha.com/input/?i=is+123456789123456789**7+square). – Veedrac

+0

et 123123123432 ** 7 n'est pas un carré parfait: sa superficie se situe entre 654920651322780642131484946101910838253 et 654920651322780642131484946101910838254 – blabla999

0
def isPerfectSquare(number): 
    return len(str(math.sqrt(number)).split('.')[1]) == 1 
0

Je pense que cela est probablement court.

def issquare(): 
     return (m**.5 - int(m**.5)==0) 
Questions connexes