On dispose les chiffres de la facon suivante :
1 2 3 4 5 6 7 8 9
en intercalant les opérateurs +-*/, on peut par exemple obtenir:
12+3-4+5*6+7/8+9 = 15
Comment peut on trouver 421 ?
Analyse
En fait on s'apercoit que l'on a pas 4 opérateurs mais 5 ! Car ne pas mettre
d'opérateurs revient à faire : Vn-1 * 10 + Vn.e.g: 12 = 1 *10+ 2. Cette opérateur
s'applique de gauche à droite et est de priorité maximale. Ensuite la difficulté
(toute relative) vient de la priorité de */ sur +-, mais comme il n'y a pas de parenthèse
il suffit d'executer ces opérateurs en premier. Il suffit donc d'intercaler nos
5 opérateurs entre les 9 chiffres puis de faire le calcul.
Programme
#define NBNB 9
#define NBCH (NBNB-1)
#define NBOP 5
int tc[] = { 1,2,3,4,5,6,7,8,9 };
int to[] = { 0,0,0,0,0,0,0,0 };
int plus (int *a, int b) { return (*a += b); }
int moins(int *a, int b) { return (*a -= b); }
int multi(int *a, int b) { return (*a *= b ); }
int fdix (int *a, int b) { return (*a = *a*10+b ); }
int divis(int *a, int b) { if ( !(*a%b) ) return (*a /= b ); return 0; }
int (*f[])(int *,int) = { plus , moins , divis, multi, fdix };
char *s = "+-/*";
void affiche () {
int i;
for ( i=0; i<NBCH; i++ ) printf("%d%0.1s",tc[i],(s[to[i]]?&s[to[i]]:""));
printf("%d\n",tc[i]);
}
int calcul ( void ) {
int tr[NBNB], mto[NBCH];
int o,mo, no = NBCH;
int i;
memcpy(tr, tc, sizeof(tc));
memcpy(mto, to, sizeof(to));
for ( o=NBOP-1 ; o>=0 ; o-- )
for ( mo=0 ; mo < no ; )
if ( o == mto[mo] ) {
if ( (*f[mto[mo]])(&tr[mo],tr[mo+1]) ) {
for ( i=mo+1; i<no+1 ; i++ ) tr[i] = tr[i+1];
for ( i=mo; i<no ; i++ ) mto[i] = mto[i+1];
if ( !--no ) return tr[0];
} elsereturn 0;
} else mo++;
return 0;
}
int plus_un ( int c ) {
if ( c == -1 ) return 0;
if ( ++(to[c]) == NBOP ) {
to[c] = 0;
return plus_un(--c);
}
return 1;
}
int main ( void ) {
do {
if ( calcul() == 421 ) affiche();
} while ( plus_un(NBCH-1 ) ) ;
}
Conclusion
Si vous n'aimez pas les dés
ni les jeux de société
vous pouvez toujours coder
un peu de langage C.
Conclusion
Si vous n'aimez pas les dés
ni les jeux de société
vous pouvez toujours coder
un peu de langage C.