Le compte est ... 421

Problème



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

Voir le code dans une autre fenetre


#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];
        } else
          return 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.



codingfun_nospam_@salemioche.com
Dernière mise à jour: 12 Jun 2009 - Réalisé avec youhp3
A voir : Calculatrice - Glaces.org - Sorbets.org - IP relax - creer son site / forum
v1.0 - © Nicolas JEAN :CV - NiKoZEN : Création site internet 2002-2009
Hébergement web - appareils musculation - Lingerie - rencontre
saut en parachute - shopping en ligne - referencement site web