Décomposition du compte est bon !

3/5 (3 avis)

Snippet vu 6 440 fois - Téléchargée 37 fois

Contenu du snippet

Ceci est le code qui trouve la solution du compte est bon ! L'algorithme est assez complexe et est basé sur un appel récursif. Je l'ai classé dans jeu mais il convient peut-être plus de le mettre dans la catégorie Maths et Algorithmes ! Je m'excuse pour les commentaires le les ai quelque peu omis pour cette source ! Imbattable maintenant, non ?

Source / Exemple :


/* decomposer n en une operation de au plus a nombres du tableau t

  • /
#include <stdio.h> #include <string.h> #include <conio.h> int i; typedef long (* fct)(long, long); //Les 4 opérations fondamentales long plus(long a, long b) { return a+b;} long moins(long a, long b) { return a-b;} long mult(long a, long b) { return (a==1 || b==1)?-10000:a*b;} long div(long a, long b) { return (b!=0 && a%b==0)?a/b:-10000;} fct f[]={div,mult,plus, moins}; char nom[]={'/','x','+','-'}; char res[255]; //Fonction de decomposition long decompose(long n, long a, long *t) { long v[6]; char tmp[80]; int i,j,k,l,op; if (a<=0) return 0; if (a==1) { if (n==t[0]) return 1; else return 0; } for (i=0;i<a;++i) { if (t[i]==n) { printf("Sol : %ld \n",t[i]); return 1; } for (j=1;j<a;++j) { if (j==i) continue; for (op=0;op<4;++op) { if ((v[0]=f[op](t[i],t[j]))<0) continue; for (k=1,l=0;l<a;++l) { if (l==i || l==j) continue; v[k++]=t[l]; } if (decompose(n,a-1,v)==1) { strcpy(tmp,res); sprintf(res,"%ld = %ld %c %ld\n", f[op](t[i],t[j]),t[i],nom[op],t[j]); strcat(res,tmp); return 1; } } } } return 0; } long int main() { long int t[]={1,4,7,10,25,50}; //Un tableau à 6 chiffres qui sera ecrasé par les valeurs saisies long int n=165; long int d=0; for (i=0; i<6 ; i++) { printf("\nRentrer le %d nombre :", i); scanf("%d", &t[i]); } //La valeur à trouver : on aurait pu faire une fonction aléatoire ! printf("Donner la valeur à trouver : "); scanf("%d", &n); //Petit récapitutif de la saisie printf("\n\nVoilà vos nombres rentrés :"); for (i=0; i<6 ; i++) { printf("%d ", t[i]); } printf("\nVous devez trouver : %d\n", n); getch(); /*for (n=1;n<999;++n) {*/ strcpy(res,""); while(!decompose(n,6,t)) { //fct principale d=-d +( (d>0)?-1:1); n+=d; printf("%ld\n ",n); } printf("\n%ld",n); printf("\n"); printf(res); printf("--------------\n"); /*}*/ printf("\nFin de la recherche..."); getch(); return 0; }

A voir également

Ajouter un commentaire Commentaires
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
26 juin 2006 à 15:41
Pareil!!!
Un peu en retard par rapport a la date mais ca marche denfer!

Par contre..je viens de m'apercevoir que l'algo n'est pas optimal...
Sur l'exemple donnée
165 avec 1 4 7 10 25 50
Il termine sur 250-85 = 165...
Mais il y a
50*4 = 200
10+25 = 35
200-35 = 165

Le compte est bon sauf erreur de ma part...
midovich Messages postés 1 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 27 décembre 2005
27 déc. 2005 à 03:38
c vraiment genial
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
27 juin 2003 à 17:43
bien joué ....

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.