Problème (13 points) — dans l’esprit des problèmes des sessions principales 2015 et 2025
Un entier naturel composé n (c’est-à-dire non premier, avec n ≥ 4) est dit nombre de Smith si la somme de ses chiffres est égale à la somme des chiffres de tous ses facteurs premiers, chaque facteur étant compté autant de fois qu’il apparaît dans la décomposition de n en produit de facteurs premiers.
Exemples :
- 58 = 2 × 29 : la somme des chiffres de 58 est 5 + 8 = 13 et celle de ses facteurs est 2 + (2 + 9) = 13, donc 58 est un nombre de Smith.
- 27 = 3 × 3 × 3 : 2 + 7 = 9 et 3 + 3 + 3 = 9, donc 27 est un nombre de Smith.
- 30 = 2 × 3 × 5 : 3 + 0 = 3 alors que 2 + 3 + 5 = 10, donc 30 n’est pas un nombre de Smith.
- 13 est premier : 13 n’est pas un nombre de Smith, bien que la somme de ses chiffres soit égale à celle de son unique facteur.
On se propose d’écrire un programme qui permet de :
- remplir un tableau T1 par N1 entiers (5 ≤ N1 ≤ 20), chacun composé de 2 à 4 chiffres ;
- générer un deuxième tableau T2 contenant les entiers de T1 qui sont des nombres de Smith ;
- afficher les entiers de T2 regroupés selon leur nombre de chiffres, comme dans l’exemple suivant.
Exemple : pour N1 = 12 et T1 = [85, 4937, 202, 31, 666, 1000, 94, 3251, 58, 729, 121, 2025], le tableau généré est T2 = [85, 202, 666, 94, 58, 729, 121] et le programme affiche les trois lignes :
- « 85, 94, 58 : nombre(s) de Smith de 2 chiffres. »
- « 202, 666, 729, 121 : nombre(s) de Smith de 3 chiffres. »
- « Aucun nombre de Smith de 4 chiffres. »
Travail demandé :
- Vérifier, en détaillant les calculs, que 378 est un nombre de Smith et que 91 n’en est pas un.
- Briques du test :
- Écrire l’algorithme d’une fonction SomChif(n) qui retourne la somme des chiffres d’un entier naturel n.
- Écrire l’algorithme d’une fonction SomFact(n) qui, pour un entier n ≥ 2, retourne la somme des chiffres de ses facteurs premiers (comptés avec leur multiplicité) si n est composé, et 0 si n est premier. On cherchera les diviseurs de n à partir de 2, en divisant n chaque fois que c’est possible. Exemples : SomFact(85) retourne 13 car 85 = 5 × 17 ; SomFact(97) retourne 0.
- En faisant appel aux deux fonctions précédentes, écrire l’algorithme d’une fonction booléenne Smith(n) qui vérifie si n est un nombre de Smith.
- Écrire l’algorithme d’une procédure Premiers_Smith(N) qui affiche les N premiers nombres de Smith. Pour N = 6, elle affiche 4, 22, 27, 58, 85 et 94. N est déjà saisi dans le programme appelant.
- Écrire l’algorithme du programme principal, solution au problème posé, en le décomposant en modules (Remplir, Generer, Afficher).
- Écrire l’algorithme de chacun des modules Remplir, Generer et Afficher.
N.B. : le candidat est appelé à dresser les tableaux de déclaration des objets et des nouveaux types nécessaires.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : décomposer en divisant chaque fois par le plus petit diviseur possible ; ce diviseur est forcément premier. 378 = 2 × 189 = 2 × 3 × 63 = 2 × 3 × 3 × 21 = 2 × 3 × 3 × 3 × 7.
- Somme des chiffres de 378 : 3 + 7 + 8 = 18 ; somme des chiffres des facteurs : 2 + 3 + 3 + 3 + 7 = 18. 378 est composé et les deux sommes sont égales : 378 est un nombre de Smith.
- 91 = 7 × 13 : 9 + 1 = 10 alors que 7 + (1 + 3) = 11. 91 n’est pas un nombre de Smith.
2.a Idée : n Mod 10 donne le chiffre des unités, n Div 10 le supprime ; on s’arrête quand n devient nul.
Fonction SomChif (n : Entier) : Entier
DEBUT
s ← 0
Tant que n ≠ 0 Faire
s ← s + n Mod 10
n ← n Div 10
Fin Tant que
Retourner s
FINTDOL de SomChif : s — Type/Nature : Entier — somme des chiffres déjà extraits.
2.b Idée : tant que n > 1, si d divise n on ajoute les chiffres de d et on divise n par d (sans changer d, pour compter la multiplicité) ; sinon on passe à d + 1. Chaque d retenu est premier, puisque ses propres diviseurs ont déjà été retirés. Un seul facteur trouvé signifie que n était premier.
Fonction SomFact (n : Entier) : Entier
DEBUT
s ← 0
nbf ← 0
d ← 2
Tant que n > 1 Faire
Si n Mod d = 0 Alors
s ← s + SomChif(d)
nbf ← nbf + 1
n ← n Div d
Sinon
d ← d + 1
FinSi
Fin Tant que
Si nbf ≥ 2 Alors
Retourner s
Sinon
Retourner 0
FinSi
FINTDOL de SomFact :
s— Type/Nature : Entier — somme des chiffres des facteursnbf— Type/Nature : Entier — nombre de facteurs premiers trouvésd— Type/Nature : Entier — diviseur essayéSomChif— Type/Nature : Fonction — somme des chiffres
Contrôle sur 85 : d = 2, 3, 4 ne divisent pas ; d = 5 donne s = 5 et n = 17 ; d avance jusqu’à 17, s = 5 + 8 = 13 et n = 1 ; nbf = 2, la fonction retourne 13. Pour 97, le seul facteur est 97 lui-même (nbf = 1) : retour 0. Le paramètre n est passé par valeur : le diviser dans la fonction ne modifie pas l’objet de l’appelant.
2.c Idée : traduire la définition mot pour mot — composé (SomFact non nul) et sommes égales.
Fonction Smith (n : Entier) : Booléen
DEBUT
f ← SomFact(n)
Retourner (f ≠ 0) Et (f = SomChif(n))
FINTDOL de Smith : f — Entier — résultat de SomFact ; SomFact, SomChif — Fonction. Avec 13 : SomFact(13) = 0, le test est faux, conformément à l’exemple de l’énoncé.
3. Idée : on ne sait pas jusqu’où chercher, seulement combien en trouver : boucle Répéter avec un compteur, en partant de 4, le plus petit entier composé.
Procédure Premiers_Smith (N : Entier)
DEBUT
cpt ← 0
n ← 3
Répéter
n ← n + 1
Si Smith(n) Alors
Ecrire(n)
cpt ← cpt + 1
FinSi
Jusqu'à cpt = N
FINTDOL : cpt, n — Entier — nombres trouvés, entier examiné ; Smith — Fonction. Pour N = 6 : 4 = 2 × 2 (4 et 2 + 2), 22 = 2 × 11 (4 et 4), puis 27, 58, 85 et 94.
4. Programme principal :
Algorithme Nombres_Smith
DEBUT
Remplir(T1, N1)
Generer(T1, N1, T2, N2)
Afficher(T2, N2)
FINTableau de déclaration des nouveaux types : TAB = Tableau de 20 Entiers.
Tableau de déclaration des objets globaux :
T1,T2— Type/Nature : TAB — entiers saisis, nombres de Smith retenusN1,N2— Type/Nature : Entier — tailles effectives de T1 et T2Remplir,Generer,Afficher— Type/Nature : Procédure
5. Idée : la saisie contrôle les deux contraintes chiffrées de l’énoncé ; un entier de 2 à 4 chiffres est compris entre 10 et 9999.
Procédure Remplir (@T : TAB, @N : Entier)
DEBUT
Répéter
Ecrire("N1 = "), Lire(N)
Jusqu'à (N ≥ 5) Et (N ≤ 20)
Pour i de 0 à N - 1 Faire
Répéter
Ecrire("T1[", i, "] = ")
Lire(T[i])
Jusqu'à (T[i] ≥ 10) Et (T[i] ≤ 9999)
Fin Pour
FINTDOL de Remplir : i — Entier — compteur.
Procédure Generer (T1 : TAB, N1 : Entier,
@T2 : TAB, @N2 : Entier)
DEBUT
N2 ← 0
Pour i de 0 à N1 - 1 Faire
Si Smith(T1[i]) Alors
T2[N2] ← T1[i]
N2 ← N2 + 1
FinSi
Fin Pour
FINTDOL de Generer : i — Entier — compteur ; Smith — Fonction. N2 sert à la fois de compteur et de prochaine case libre de T2.
Idée pour l’affichage : pour chaque longueur k de 2 à 4, on parcourt T2 et on concatène les éléments de k chiffres ; une chaîne restée vide donne la ligne « Aucun… ».
Procédure Afficher (T : TAB, N : Entier)
DEBUT
Pour k de 2 à 4 Faire
ch ← ""
Pour i de 0 à N - 1 Faire
Si Long(Convch(T[i])) = k Alors
Si ch ≠ "" Alors
ch ← ch + ", "
FinSi
ch ← ch + Convch(T[i])
FinSi
Fin Pour
Si ch = "" Alors
Ecrire("Aucun nombre de Smith de ",
k, " chiffres.")
Sinon
Ecrire(ch, " : nombre(s) de Smith",
" de ", k, " chiffres.")
FinSi
Fin Pour
FINTDOL d’Afficher : k, i — Entier — nombre de chiffres traité, compteur ; ch — Chaîne — ligne en construction.
Sur l’exemple : 4937 et 3251 sont premiers (SomFact retourne 0), 31 aussi ; 1000 = 2³ × 5³ donne 1 contre 21 et 2025 = 3⁴ × 5² donne 9 contre 22. Restent 85, 202 = 2 × 101, 666 = 2 × 3 × 3 × 37, 94, 58, 729 = 3⁶ et 121 = 11 × 11, soit T2 = [85, 202, 666, 94, 58, 729, 121] ; les trois lignes affichées sont celles de l’énoncé, la longueur 4 n’ayant aucun élément.