Calculer les nombres d'Armstrong
bounjour a tout svp je veux avoir une solution pour un algo de Armstrong :oops::oops:
Calculer les nombres d'Armstrong
Citation:
A quoi peut bien servir une manip pareille.
À l'entraînement des malheureux débutants en programmation :aie: .
L'énoncé exact du problème consistant en la recherche des entiers égaux à la somme des puissances (c) des (c) chiffres qui les composent, en notation décimale.
Deux options pour leur recherche, par exemple pour (c = 3):
a) un balayage simple du domaine, suivi de la décomposition de l'entier considéré n = <ijk> = (100*i) + (10*j) + k
Code:
1 2
| FOR n:= 100 TO 999 DO
... |
b) trois boucles imbriquées:
Code:
1 2 3 4
|
FOR i:= 1 TO 9 DO
FOR j:= 0 TO 9 DO
FOR k:= 0 TO 9 DO ... |
avec vérification de l'égalité: (100*i) + (10*j) + k = i3 + j3 + k3 .
Les solutions dépendent de la base de numération.
On rencontre beaucoup de variantes à cet énoncé; le travail mathématique consiste à borner les solutions, afin de ne pas se lancer dans des recherches inutiles.
Exemple: 145 = 1! + 4! + 5! . Trouver l'autre solution égale à la somme des factorielles de ses chiffres.
Calculer les nombres d'Armstrong
La seconde référence citée dans l'article de Wikipédia décrit les quatre sortes de nombres d'Armstrong; sous cet aspect la demande de simokhobouz est floue, faute d'indiquer ce qu'il recherche.
Il s'agit vraisemblablement du cas le plus simple, celui des nombres de quatrième espèce d'ordre (p), vérifiant: n = Sk=1c(dk)p ,
où (dk) représente le kème chiffre compté à partir de la droite: n = <dcdc-1 ... d2d1> = Sk=1c(10(k-1)*dk) .
L'article disponible sur MathWorld fournit de nombreuses informations.
1°) Le problème étudié, ainsi que quelques variantes, relèvent du même algorithme, celui de la recherche d'un entier égal à la somme de (c) termes dépendant chacun du chiffre correspondant: n = Sk=1cF(dk) ;
la fonction entière en cause pouvant être:
# F(d) = dp (nombres d'Armstrong de 4me espèce),
# F(d) = dd (nombres d'Armstrong de 2nde espèce),
# F(d) = d! (fonction factorielle) ... liste non limitative.
Il est alors avantageux de calculer une fois pour toutes les 10 valeurs de la fonction, lors de l'initialisation d'une liste de 10 entiers; plusieurs codes sont envisageables, par exemple:
Code:
1 2 3 4
|
VAR F: ARRAY[0..9] OF LongInt;
FOR k:= 0 TO 9 DO F[k]:= Cube(k); |
La valeur de la fonction est alors directement donnée par F[d].
2°) Le recours à (c) boucles imbriquées, dans le cas d'un petit nombre de chiffres, paraît le plus facile à mettre en oeuvre, en raison de la simplicité du passage de la séquence de chiffres à l'entier correspondant:
Code:
1 2 3 4 5 6
|
u:= d[c];
FOR k:= (c - 1) DOWNTO 1 DO BEGIN
v:= 10 * u; u:= v + d[k]
END;
n:= u; |
Le passage inverse semble plus approprié à un nombre quelconque de chiffres:
Code:
1 2 3 4 5
|
u:= n;
FOR k:= 1 TO c DO BEGIN
v:= u DIV 10; d[k]:= u MOD 10; u:= v
END; |
Il faut comparer les délais d'exécution, et ne pas oublier que l'on se retrouvera face à un mur au-delà d'une dizaine de chiffres.
Calculer les nombres d'Armstrong
Dernier détail, last but not least, l'équation n = Sk=1cF(dk), dans laquelle intervient la fonction croissante F(d), admet-elle des solutions entières à (c) chiffres dans la base considérée ?
L'entier (n) est borné par Nmin = <1000...0> ("1", suivi de (c-1) zéros), soit Nmin = 10(c-1) ,
et Nmax = <999...9> (c chiffres "9"), soit Nmax = 10c - 1 ;
la somme S = Sk=1cF(dk) par Smin = F(1) , inférieure aux deux limites précédentes dès que (c>1) ,
et Smax = F(9) * c , dont l'augmentation en fonction de (c) est beaucoup moins rapide que celle de Nmax , qui comporte un terme exponentiel.
L'existence d'une solution vérifiant: n = S , donc soumise aux conditions: Nmin <= n et S <= Smax , implique une intersection non vide pour des deux domaines [Nmin ; Nmax] , [Smin ; Smax] ,
et que l'on ait par conséquent: Nmin <= Smax , soit: 10(c-1) <= F(9) * c ou encore c <= lg(10*F(9)*c) .
Dans le cas des nombres d'Armstrong de 4me espèce (F(d) = dp) la limite de (c) est celle de la suite: uk+1 = lg(10*(9p)*uk) ,
et l'on trouve pour quelques valeurs de (p):
Code:
1 2 3
| 2 3.445 771
3 4.517 639
4 5.562 218 |
Ceux ceux de la seconde espèce (F(d) = dd) correspondent à p = 9 (F(9) = 99), d'où la limite:
Les nombres d'Armstrong de première espèce (F(d) = dc) conduisent à l'inéquation: 10c <= 10*9c*c , d'où: c <= Ln(10*c) / Ln(10/9) et c <= 60.847 858 .
Si vous trouvez les dernières solutions en moins de deux heures, je serais intéressé par la marque de votre PC.
Je vous refile un tuyau :aie:: les plus grands entiers ne comportent que 39 chiffres, et ne diffèrent que de (1):
Code:
1 2 3
|
115132219018763992565095597973971522400,
115132219018763992565095597973971522401 |