bounjour a tout svp je veux avoir une solution pour un algo de Armstrong
bounjour a tout svp je veux avoir une solution pour un algo de Armstrong
Il d'y a pas d'algo d'Amstrong mais un nombre d'Amstrong
Pour l'obtenir, tu découpe la chaîne en caractères, tu en extrait les valeurs, tu élève les valeurs au cube et tu additionne.
C'est pas sorcier.
La question qui se pose, c'est: A quoi peut bien servir une manip pareille.
Savoir pour comprendre et vice versa.
À l'entraînement des malheureux débutants en programmation .A quoi peut bien servir une manip pareille.
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
b) trois boucles imbriquées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 FOR n:= 100 TO 999 DO ...
avec vérification de l'égalité: (100*i) + (10*j) + k = i3 + j3 + k3 .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 FOR i:= 1 TO 9 DO FOR j:= 0 TO 9 DO FOR k:= 0 TO 9 DO ...
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.
@: wiwaxia: J'ai trouvé ça;
" est un entier naturel n non nul qui est égal à la somme des puissances p-ièmes de ses chiffres en base dix, où p désigne le nombre de chiffres de n"
Avec l'ambiguïté de n qui ici est en même temps le nombre cherché et engendre p.
Savoir pour comprendre et vice versa.
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:
La valeur de la fonction est alors directement donnée par F[d].
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 VAR F: ARRAY[0..9] OF LongInt; FOR k:= 0 TO 9 DO F[k]:= Cube(k);
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:
Le passage inverse semble plus approprié à un nombre quelconque de chiffres:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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):
Ceux ceux de la seconde espèce (F(d) = dd) correspondent à p = 9 (F(9) = 99), d'où la limite:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 2 3.445 771 3 4.517 639 4 5.562 218
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 .
Code : Sélectionner tout - Visualiser dans une fenêtre à part 9 10.614 064
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 : les plus grands entiers ne comportent que 39 chiffres, et ne diffèrent que de (1):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 115132219018763992565095597973971522400, 115132219018763992565095597973971522401
merci a touts pour vous repense
j'ai trouver la solution ça marche bien
et voila le code source en langage C
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include<stdio.h> #include<stdlib.h> int main(){ int s,i,j,k,n; for(i=0;i<=9;i++){ for(j=0;j<=9;j++){ for(k=0;k<=9;k++){ n=100*i+10*j+k; s=i*i*i+k*k*k+j*j*j; if (s==n && n>=100){ printf("%d\t",s); } } } } return 0; }
Avec ce programme, tu recherches les nombres d'Armstrong entre 100 et 999. La question initiale parlait des nombres d'Armstrong en général.
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager