2014-07-01 5 views
0

J'ai un problème avec mon code. La tâche consistait à rechercher 3 entiers qui résolvent cette équation 6 * a + 9 * b + 20 * c = x, où x est une entrée. Le problème est que mon code ne fonctionne que pour les flottants, et je ne peux pas le forcer à me donner une réponse uniquement lorsque a, b, c sont des entiers.Comment travailler uniquement sur ints en Python?

Voici le code en Python:

def mc_nuggets(numWings): 
    for Na in range(0, numWings + 1): 
     for Nb in range(0, numWings - Na + 1): 
      for Nc in range(0, numWings - Na - Nb + 1): 
       num_a = (numWings - 9*Nb - 20*Nc)/6 
       num_b = (numWings - 6*Na - 20*Nc)/9 
       num_c = (numWings - 9*Nb - 6*Nc)/20 
       if (6*num_a + 9*num_b + 20*num_c == numWings and type(num_a) is int == True and type(num_b) is int == True and type(num_c) is int == True): 
        return [num_a, num_b, num_c] 
return [None, None, None]    

Do u ont des idées comment le faire fonctionner?

+0

est incorrect Indentation – juankysmith

+3

Ce que tu fais dans le cadre du MIT 6.00x? – jonrsharpe

+0

est l'équation correcte 6 * a + 9 * b + 20 * b ou il devrait être 6 * a + 9 * b + 20 * c –

Répondre

1

Utilisez-vous python 2 ou 3? Sur python 2, votre code va tronquer l'entier, donc c'est incorrect.

Sur python 3, ce n'est pas parce que la valeur est 3.0 que le type est entier, il est flottant. Pour vérifier s'il s'agit d'une valeur entière, utilisez la méthode is_integer, voir https://docs.python.org/2/library/stdtypes.html#float.is_integer.

Voici une méthode pour le faire sans avoir à faire sans float: Vous devriez itérer directement sur a et b. La plus grande valeur pour a est numwings/6 (quand b et c sont 0). Ensuite, vous pouvez itérer b jusqu'à (numwings - 6 * a)/9. Une fois que vous y êtes, vous savez que 20 * c = numwings - 6 * a - 9 * b donc vous n'avez pas besoin de votre troisième boucle, et vous pouvez facilement vérifier s'il y a un entier tel que l'équation précédente est correcte (vérifiez avec modulo par exemple).

+0

Il est également possible d'utiliser // l'opérateur pour rester dans le champ entier seulement. – greatvovan

+0

@greatvovan Oui mais si vous utilisez l'opérateur '//' vous avez le même problème qu'avec python 2, vos valeurs sont tronquées. Dans ce cas, il ne générera qu'une solution multiple avec la même valeur. – Holt

+0

Je suis sur les frontières de l'itération, elles devraient être entières de toute façon. – greatvovan

0

ma solution au problème:

def mc_nuggets(numWings): 
    for Na in range(0, numWings + 1): 
     for Nb in range(0, numWings - Na + 1): 
      for Nc in range(0, numWings - Na - Nb + 1): 
       num_a = (numWings - 9*Nb - 20*Nc) 
       num_b = (numWings - 6*Na - 20*Nc) 
       num_c = (numWings - 9*Nb - 6*Na) 
       if (num_a % 6 == 0 and num_b % 9 == 0 and num_c % 20 == 0): 
        if (num_a >= 0 and num_b >= 0 and num_c >= 0): 
         return [num_a/6, num_b/9, num_c/20] 
    return [None, None, None] 
Questions connexes