/*************************************************************************************************************************************/ /* */ /* P A R A D O X E " D E S S I L E N C E S Q U I E N D I S E N T L O N G " : */ /* */ /* */ /* Nota : */ /* */ /* Ce probleme a ete pose par Jean-Paul Delahaye */ /* dans sa rubrique "Paradoxes" du numero 51 de la */ /* revue "Les Nouvelles d'Archimede" (deuxieme */ /* trimestre 2009, pages 20 et 21). */ /* */ /* */ /* Author of '$xtc/Paradoxe_JP_Delahaye.01$vv$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20090326110530). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" #define A \ 1 #define Z \ 10 /* Bornes de definition des cinq nombres entiers {a,b,c,d,e}. */ #define DIMENSION \ (MaximumHistogrammes-MinimumHistogrammes+1) #define ACCES(Histogramme,valeur) \ Histogramme[valeur-MinimumHistogrammes] /* Dimension des histogrammes et acces direct. */ #define LIBRE \ 0 #define BLOQUE \ 1 #define BLOCAGE(HistogrammeX) \ { \ if (HistogrammeX[index] == 1) \ { \ Blocage##HistogrammeX[index]=BLOQUE; \ } \ else \ { \ } \ } /* Blocage des histogrammes. */ #define CALCULS_QUINTUPLETS(sequence) \ { \ for (a=A ; a<=Z ; a++) \ { \ for (b=a+1 ; b<=Z ; b++) \ { \ for (c=b+1 ; c<=Z ; c++) \ { \ for (d=c+1 ; d<=Z ; d++) \ { \ for (e=d+1 ; e<=Z ; e++) \ { \ int produit=a*b*c*d*e; \ int somme__=a+b+c+d+e; \ int carre__=(a*a)+(b*b)+(c*c)+(d*d)+(e*e); \ int valeur_=(a+b+c)*(d+e); \ /* Calcul systematique des quatre fonctions de {a,b,c,d,e}. */ \ \ sequence; \ /* Sequence variable... */ \ } \ } \ } \ } \ } \ } main() { int a,b,c,d,e; /* Definition des cinq nombres {a,b,c,d,e} dans [A,Z] tels que a<b<c<d<e. */ int NombreQuintuplets=0; /* Nombre de Quintuplets (le 20090427101905 je note qu'avec les definitions par defaut */ /* -soit cinq nombres dans [1,10]- il vaut 'COnm(10,5)=252'). */ int MinimumHistogrammes=0x7fffffff; int MaximumHistogrammes=0x80000000; /* Extrema des histogrammes. */ int IlFautEditer=FAUX; /* Afin de pouvoir editer, si besoin est, tous les quintuplets et les valeurs des quatre */ /* fonctions. */ CALCULS_QUINTUPLETS( { NombreQuintuplets++; MinimumHistogrammes=MIN2(MinimumHistogrammes,produit); MinimumHistogrammes=MIN2(MinimumHistogrammes,somme__); MinimumHistogrammes=MIN2(MinimumHistogrammes,carre__); MinimumHistogrammes=MIN2(MinimumHistogrammes,valeur_); MaximumHistogrammes=MAX2(MaximumHistogrammes,produit); MaximumHistogrammes=MAX2(MaximumHistogrammes,somme__); MaximumHistogrammes=MAX2(MaximumHistogrammes,carre__); MaximumHistogrammes=MAX2(MaximumHistogrammes,valeur_); } ); /* Dimensionnement... */ { /* Ouverture d'un nouveau bloc afin d'assurer le dimensionnement variable des histogrammes */ /* et de leurs bloqueurs... */ int NumeroIteration=0; int UnQuintupletUniqueExiste=FAUX; /* Controle de l'iteration principale... */ int index; int HistogrammeP[DIMENSION],BlocageHistogrammeP[DIMENSION]; int HistogrammeS[DIMENSION],BlocageHistogrammeS[DIMENSION]; int HistogrammeC[DIMENSION],BlocageHistogrammeC[DIMENSION]; int HistogrammeV[DIMENSION],BlocageHistogrammeV[DIMENSION]; /* Definition des histogrammes, de leurs bloqueurs et de leur index. */ for (index=0 ; index<DIMENSION ; index++) { BlocageHistogrammeP[index]=LIBRE; BlocageHistogrammeS[index]=LIBRE; BlocageHistogrammeC[index]=LIBRE; BlocageHistogrammeV[index]=LIBRE; /* A priori, aucune entree dans les histogrammes {P,S,C,V} n'est bloquee... */ } while (UnQuintupletUniqueExiste == FAUX) { int CompteurQuintupletsNonAmbigus=0; /* Compteur des cas non ambigus... */ int Ga,Gb,Gc,Gd,Ge; int Gproduit,Gsomme__,Gcarre__,Gvaleur_; /* Valeur de {produit,somme,carre,valeur} Gagnante (correspondant au dernier quintuplet */ /* {a,b,c,d,e} non ambigu qui est Gagnant s'il est unique...). */ NumeroIteration++; for (index=0 ; index<DIMENSION ; index++) { HistogrammeP[index]=0; HistogrammeS[index]=0; HistogrammeC[index]=0; HistogrammeV[index]=0; /* Initialisation des histogrammes. */ } CALCULS_QUINTUPLETS( { if ( (ACCES(BlocageHistogrammeP,produit) == BLOQUE) || (ACCES(BlocageHistogrammeS,somme__) == BLOQUE) || (ACCES(BlocageHistogrammeC,carre__) == BLOQUE) || (ACCES(BlocageHistogrammeV,valeur_) == BLOQUE) ) { } else { ACCES(HistogrammeP,produit)++; ACCES(HistogrammeS,somme__)++; ACCES(HistogrammeC,carre__)++; ACCES(HistogrammeV,valeur_)++; /* Calcul des histogrammes des produits, des sommes, des sommes des carres et des valeurs, */ /* a condition qu'il n'y ait aucun blocage... */ } } ); for (index=0 ; index<DIMENSION ; index++) { BLOCAGE(HistogrammeP); BLOCAGE(HistogrammeS); BLOCAGE(HistogrammeC); BLOCAGE(HistogrammeV); /* Blocage des entrees non ambigues (histogramme=1)... */ } CALCULS_QUINTUPLETS( { if ( (ACCES(HistogrammeP,produit) == 1) && (ACCES(HistogrammeS,somme__) == 1) && (ACCES(HistogrammeC,carre__) == 1) && (ACCES(HistogrammeV,valeur_) == 1) ) { CompteurQuintupletsNonAmbigus++; Ga=a; Gb=b; Gc=c; Gd=d; Ge=e; Gproduit=produit; Gsomme__=somme__; Gcarre__=carre__; Gvaleur_=valeur_; /* Comptage du nombre de cas non ambigus (pour lesquels les quatre histogrammes sont egaux */ /* a 1) et memorisation du dernier cas rencontre, qui si il est unique est le Gagnant... */ } else { } } ); if (CompteurQuintupletsNonAmbigus == 1) { printf("A l'iteration %d un quintuplet unique a ete trouve :",NumeroIteration); printf(" {a=%d,b=%d,c=%d,d=%d,e=%d}",Ga,Gb,Gc,Gd,Ge); printf(" {P=%d,S=%d,C=%d,V=%d}",Gproduit,Gsomme__,Gcarre__,Gvaleur_); printf("\n"); /* La solution pour [1,10] est : */ /* */ /* a=2 b=5 c=6 d=7 e=8 P=3360 S=28 C=178 V=195 */ /* */ UnQuintupletUniqueExiste=VRAI; /* C'est fini... */ } else { if (NumeroIteration > NombreQuintuplets) /* Ce test n'est peut-etre pas optimal, mais il est le plus general... */ { printf("Le probleme n'a pas de solution...\n"); UnQuintupletUniqueExiste=VRAI; /* On aborte en faisant comme si une solution existait... */ } else { } } } if (IlFautEditer == VRAI) { printf("\n"); CALCULS_QUINTUPLETS( { printf("a=%02d b=%02d c=%02d d=%02d e=%02d",a,b,c,d,e); printf(" P=%05d (NP=%03d)",produit,ACCES(HistogrammeP,produit)); printf(" S=%02d (NS=%03d)",somme__,ACCES(HistogrammeS,somme__)); printf(" C=%03d (NC=%03d)",carre__,ACCES(HistogrammeC,carre__)); printf(" V=%03d (NV=%03d)",valeur_,ACCES(HistogrammeV,valeur_)); printf("\n"); /* Edition eventuelle de tous les resultats. */ } ); } else { } } }