Voilà mon implémentation avec l'utilisation d'une fonction som_div :
Texte caché : cliquez sur le cadre pour l'afficher
- Code: Tout sélectionner
#Fonction som_div comme imposé
def som_div( n , b ): #n : entier, s : booléen (compter le nombre lui-même ?)
s = 1 #somme (1 divise tous les entiers)
i = 2 #compteur
lim = n/2; #limite de boucle, optimise la recherche de diviseurs
#On "attaque" des deux côtés :
while i < lim :
if n % i == 0 :
s += i
lim = n/i
if lim != i :
s += lim
i += 1 ;
return s+n if b else s
- Code: Tout sélectionner
#IU
n = int(input("Entrez un entier supérieur ou égal à 2 : "))
s = som_div( n , 0 )
if( s == n ):
print( "%i"%n +" est un entier naturel parfait" )
elif( s > n ):
print( "%i"%n +" est un entier naturel abondant (la somme de ses diviseurs vaut %i)"%s )
else:
print( "%i"%n +" est un entier naturel déficient (la somme de ses diviseurs vaut %i)"%s )
Concernant la recherche des diviseurs, je pars du principe que si b divise a et a/b=c alors c divise a et on a a/c = b, du coup comme le compteur monte, on sait qu'on a besoin de tester au maximum jusqu'à n/2, n/3, n/4, etc...
Concernant le challenge algorithmique du passage de base (Kilag, qui es-tu ?), j'ai déjà été amené à le faire mais en JavaScript, du coup il est possible de
le tester en ligne. En éditant la première ligne il est possible d'étendre "dynamiquement" l'ensemble des symboles (vive la programmation agile). Je laisse le soin à ceux qui le veulent d'en faire un équivalent en Python ou autre. :P
Je voulais aussi proposer mon petit challenge :
Programmez un algorithme capable de calculer la probabilité d'obtenir 0 à 250 multiples de 3 en lançant simultanément 1000 dés à 6 faces, avec une précision au 1000ème.
Le problème est que Python a été "conçu" pour les maths donc il n'y a pas trop de challenge, mais si vous avez un peu de temps : faîte ça sur votre calculatrice. (Le but du challenge est de trouver comment contourner les limites techniques.)