C220. Les colonnes du temple
Cryptarithme proposé par Raymond Bloch
On pose la multiplication de deux entiers A à 4 chiffres et B à deux chiffres. Sur les lignes L1 à L5
figurent respectivement A, B, les résultats des deux multiplications intermédiaires et le résultat final de la multiplication A x B.
Sachant que la somme des chiffres d'une même colonne sur les cinq lignes est toujours égale à 17, déterminer A et B.
Pour les plus courageux.
Existe-t-il d'autres couples d'entiers A à 4 chiffres et B à 2 chiffres qui donnent lieu à la même représentation des lignes L1 à L5 telles que la somme des chiffres d'une même colonne est toujours la même?
Solution proposée par Simon Pellicer
1) Tout d'abord on cherche les couples de nombres tel que la somme des chiffres de la première
"colonne" vaut 17. On trouve les couples suivant (2;3) (2;7) (6;7). En effectuant une étude exhaustive pour chaque colonne des différents cas, et en les combinant on finit par trouver la solution :
A = 2587 B = 36
(avant cela on passe par 3 solutions qui sont : (2587;36);(7337;26);(7507;92) mais on élimine les deux derniers couples car la ligne L4 et L3 auraient plus de 5 chiffres).
2) On notera que le nombre de cas a testé est finit, effectivement la somme de 4 chiffres tel que chacun de ces chiffres est inférieur à 9 ne peut excéder 36.
Ainsi on vérifie à l'aide d'un programme informatique qui teste ces différentes possibilités qu'il n'existe pas d'autres couples A et B.
Voici le programme en c++ utilisé pour vérifier ce résultat :
Ce programme teste tout bêtement les différentes possibilités mais avant enregistre les chiffres de chacun des nombres dans des vectors ( des tableaux ).
#include<iostream>
#include<vector>
using namespace std;
int main() {
int f(0);
int s(0);
int copi1(0);
int copi2(0);
int rr(0);
bool t(true);
vector<int>sv;
vector<int>fv;
vector<int>q;
vector<int>d;
vector<int>r;
for(int i = 1000;i<10000;++i) {
for(int j = 10;j<100;++j) {
copi1 = i;
copi2 = j;
rr = i*j;
f = (j%10)*i;
s = (j%100-j%10)*i;
while(copi1!=0) {
q.push_back(copi1%10);
copi1/=10;
}
while(copi2!=0) {
d.push_back(copi2%10);
copi2/=10;
}
while(f !=0) {
fv.push_back(f%10);
f/=10;
}
while(s !=0) {
sv.push_back(s%10);
s/=10;
}
while(rr !=0) {
r.push_back(rr%10);
rr/=10;
} t = true;
for(int k=0;k<5;++k) {
sv.push_back(0);
fv.push_back(0);
q.push_back(0);
d.push_back(0);
r.push_back(0);
if(sv[k] + fv[k] + q[k] + d[k] +r[k]!= 17){t = false;}
}
if(t==true){cout<<i<<endl;cout<<j<<endl;}
sv.clear();
fv.clear();
q.clear();
d.clear();
r.clear();
} }
return 0;
}