Skip to content

Instantly share code, notes, and snippets.

@fabian57
Last active August 29, 2015 14:10
Show Gist options
  • Save fabian57/ae1773653023fcd1b6c9 to your computer and use it in GitHub Desktop.
Save fabian57/ae1773653023fcd1b6c9 to your computer and use it in GitHub Desktop.
C'est bon
def sum_proper_divisors(n):
acc = 0
for i in xrange(1, n):
if n % i == 0:
acc += i
return acc
def amicable_nums(n):
m = sum_proper_divisors(n)
return sum_proper_divisors(m) == n and m != n
def amicable_nums_sum(n):
acc = 0
for i in xrange(1, n + 1):
if amicable_nums(i):
acc += i
return acc
@laowantong
Copy link

Déjà, ça marche! 😄

Point de détail:

  • Le nom d'un prédicat comme amicable_nums devrait commencer par is_ ou are_.

Au niveau optimisation, je ne suis pas sûr que xrange sauve les meubles... Je n'en parle pas au premier semestre, mais y en a qui lisent la doc! C'est peut-être ça qui met ton programme légèrement en tête des solutions que j'ai vues jusqu'à présent.

1 loops, best of 3: 9.55 s per loop
1 loops, best of 3: 7.91 s per loop
10 loops, best of 3: 142 ms per loop

La première durée correspond à ton programme, la deuxième à une amélioration de nature purement algorithmique, la troisième avec une réflexion mathématique.

Pour t'aider davantage:

  • dans amicable_nums, tu fais un calcul que tu as déjà fait ou referas;
  • dans sum_proper_divisors, tu n'as vraiment pas besoin de parcourir tout l'intervalle [1, n[.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment