2010-07-29 4 views
7

Donc j'apprends Python alors je suis en train de vivre des problèmes de projet euler. Et je ne suis pas sûr si c'est un problème python que je suis, ou juste moi être retardé, mais je semble obtenir la mauvaise réponse pour le problème 53. Voici un lien vers le problèmeProjet euler en python (# 53)

et ceci est mon code:

 

from math import factorial 

def ncr(n,r): 
    return (factorial(n)/(factorial(r)*factorial(n-r))) 

i = 0 

for x in range(1,100): 
    for y in range(0,x): 
     if(ncr(x,y) > 1000000): 
      i=i+1 

print i 
 

Je reçois 3982 qui est apparemment la mauvaise réponse. Est-ce que quelque chose de mal que je fais est spécifique à python?

Répondre

8

range(a, b) n'inclut pas b.

+0

Vous étiez le jeûné, bien que vous ayez aussi la plus courte réponse = P – Falmarri

+6

Nous appelons cela pythonic –

4

Je pense que votre code est correct, cependant, vous devez itérer x à 100 inclus, vous devez donc utiliser

for x in range(1,101): 

espoir qui aide. Roches d'Euler!

3

Notez que n est supérieur ou égal à 1 et inférieur ou égal à 100. Actuellement, votre n va de 1 à 99. Vous pouvez aussi utiliser xrange.

from math import factorial 

def ncr(n,r): 
    return (factorial(n)/(factorial(r)*factorial(n-r))) 

i = 0 

for x in range(1,101): 
    for y in range(1,x+1): 
     if(ncr(x,y) > 1000000): 
      i=i+1 

print i 
+0

peut-être mentionner que range renvoie un itérateur en Python 3 – hop

+0

'xrange (101)' comprend '0' – katrielalex

+0

@hop: bon point. @katrielalex: Ah, c'est vrai. Mieux vaut alors le fixer à range(), même si dans ce cas, cela n'a pas d'importance car ncr (0,1) est plus petit que 1000000. – vtorhonen

2

Si vous êtes débutant, je profite de cette occasion, compte tenu de la nature d'Euler projet, pour donner des solutions alternatives de codage, qui est autonome et démontre l'approche de la table de recherche pour accélérer les fonctions récursives et enregistrer les réponses au dictionnaire et en utilisant le len comme compte.

Espérons que le 4075 est la bonne réponse!

from __future__ import division 
factorials={} 

def factorial(n): 
    """ factorial from lookup table ready or generate it to there """ 
    if n not in factorials: 
     factorials[n]=1 if n==0 else n*factorial(n-1) 
    return factorials[n] 

def ncr(n,r): 
    return (factorial(n)/(factorial(r)*factorial(n-r))) 

bigones= [(x,y) for x in range(1,1+100) for y in range(x) if ncr(x,y) > 1000000 ] 

print len(bigones) 
+0

Oui, je sais que je ne le fais pas de la manière la plus efficace. Mais je connais beaucoup d'autres langues et je ne fais que m'enseigner Python pour un projet sur lequel je vais travailler. +1 pour l'efficacité si – Falmarri

+0

Espérons que vous avez une certaine influence pythonienne de la compréhension de la liste et si la valeur de faire factorielle. D'ailleurs les factorielles sont exactes et non flottantes. Il n'est pas efficace dans l'espace pour garder toutes les réponses, mais c'est bien quand vous voulez continuer à expérimenter. Il maintient également le code plus propre. Mon code a 10 lignes ignorant les lignes vides et la docstring, mais la première importation est juste pour la sécurité et pas réellement nécessaire. 1/3 = 0 en python 2.6/2.7 sinon. Votre code a 9 lignes et est un bon codage de base. Commencez par le faire fonctionner, puis optimisez. –

0

Compte tenu de l'entrée de la problem specification: « Ce n'est que n = 23, qu'une valeur est supérieure à un million », vous pouvez faire la gamme pour l'extérieur 23-101:

for x in range(23,101): 
    ... 

De plus, n sur k peut être calculé plus rapidement sans générer les trois factorielles:

def noverk(n,k): 
    noverk=1 
    if 2*k < n: 
    k=n-k; 
    for i in range(1,n-k+1): 
    noverk *= (i+k) 
    noverk /= i 
    return noverk; 
Questions connexes