Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication4.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <conio.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <limits.h>
- #include <windows.h>
- #include <winbase.h>
- #define ADD '+'
- #define MUL '*'
- #define SOUS '-'
- #define DIV '/'
- typedef struct
- {
- long valeur1[16];
- char operation[16];
- long valeur2[16];
- long resultat[16];
- } solution;
- long plaqueini[16] = { 1,3,5,7,9,1 };
- long resultat = 377;
- long meilleurecart;
- int meilleurlevel;
- long NombreAppelCompte;
- long solutions;
- long plaque[16][16]; // 16*16 pour optimiser un peu
- solution savesolution;
- solution bestsolution;
- void InitCompteur(LARGE_INTEGER *Frequence); // pour calculer le temps
- void CompteurOnOff(LARGE_INTEGER *Compteur); // d'execution du programme
- void AffichePresentation(void);
- void AfficheErreurParametres(void);
- void affichesolution(int l);
- void compte(int l);
- // Pour calculer le temps d'execution du programme :
- //***************************************************
- void InitCompteur(LARGE_INTEGER *Frequence)
- {
- if (!QueryPerformanceFrequency(Frequence))
- {
- printf("Compteur non présent\n");
- printf("Appuyer sur une touche pour terminer\n");
- getch();
- exit(1);
- }
- if (Frequence->QuadPart<10000)
- {
- printf("Fréquence de l'horloge trop nulle :) : pas au dix-millième près !\n");
- printf("Appuyer sur une touche pour terminer\n");
- getch();
- exit(1);
- }
- }
- void CompteurOnOff(LARGE_INTEGER *Compteur)
- {
- if (!QueryPerformanceCounter(Compteur))
- {
- printf("Compteur non présent !\n");
- printf("Appuyer sur une touche pour terminer\n");
- getch();
- exit(1);
- }
- }
- //****************************************
- void AffichePresentation()
- {
- printf("COMPTE Copyright (c) Emmanuel Harang\n");
- printf("Programme r‚solvant LE COMPTE EST BON\n");
- printf("\n");
- }
- void AfficheErreurParametres()
- {
- printf("Entrez les 6 nombres et le nombre … trouver\n");
- printf("Exemple :\n");
- printf("compte 1 3 5 7 9 1 377\n");
- printf("Appuyer sur une touche pour terminer\n");
- getch();
- //exit(1);
- }
- void affichesolution(int l)
- {
- int i;
- printf("******************\n");
- for (i = 6; i>l; i--)
- printf("%lu %c %lu = %lu\n", bestsolution.valeur1[i], bestsolution.operation[i], bestsolution.valeur2[i], bestsolution.resultat[i]);
- printf("******************\n");
- }
- void compte(int l)
- {
- int i, j, k, n;
- long plaque1, plaque2;
- long ecart;
- long r;
- NombreAppelCompte++;
- ecart = resultat - plaque[l][0];
- if (ecart<0)
- ecart = -ecart;
- if (ecart <= meilleurecart)
- {
- if (ecart<meilleurecart)
- {
- meilleurecart = ecart;
- bestsolution = savesolution;
- meilleurlevel = l;
- if (!ecart)
- {
- printf("!ecart %d", ecart);
- solutions++;
- affichesolution(l);
- }
- }
- else // (ecart==meilleurecart)
- {
- if (!ecart)
- solutions++;
- if (l>meilleurlevel)
- {
- bestsolution = savesolution;
- meilleurlevel = l;
- if (!ecart)
- affichesolution(l);
- }
- }
- }
- if (l == 1)
- return;
- for (i = 0; i<l - 1; i++)
- {
- for (j = i + 1; j<l; j++)
- {
- plaque1 = plaque[l][i]; // prend 2 plaques
- plaque2 = plaque[l][j]; // parmi les C(l,2)=(l*l-1)/2 possibles
- n = 1;
- for (k = 0; k<l; k++)
- {
- if (k != i && k != j)
- {
- plaque[l - 1][n] = plaque[l][k];
- n++;
- }
- }
- // attention si vous mettez l--; ici pour simplifier les "l-1" qui suivent, il faut mettre l++; apres pour retablir l pour la prochaine boucle
- plaque[l - 1][0] = plaque1 + plaque2;
- savesolution.valeur1[l] = plaque1;
- savesolution.operation[l] = ADD;
- savesolution.valeur2[l] = plaque2;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- if (plaque1 != 1 && plaque2 != 1)
- {
- plaque[l - 1][0] = plaque1*plaque2;
- // savesolution.valeur1[l]=plaque1; inutile car fait juste avant
- savesolution.operation[l] = MUL;
- // savesolution.valeur2[l]=plaque2; inutile car fait juste avant
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- if (plaque1 >= plaque2)
- {
- plaque[l - 1][0] = plaque1 - plaque2;
- if (plaque[l - 1][0])
- {
- // savesolution.valeur1[l]=plaque1;
- savesolution.operation[l] = SOUS;
- // savesolution.valeur2[l]=plaque2;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- }
- r = plaque1%plaque2;
- if (!r)
- {
- plaque[l - 1][0] = plaque1 / plaque2;
- // savesolution.valeur1[l]=plaque1;
- savesolution.operation[l] = DIV;
- // savesolution.valeur2[l]=plaque2;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- }
- }
- else
- {
- plaque[l - 1][0] = plaque2 - plaque1; // toujours superieur … 0
- savesolution.valeur1[l] = plaque2;
- savesolution.operation[l] = SOUS;
- savesolution.valeur2[l] = plaque1;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- r = plaque2%plaque1;
- if (!r)
- {
- plaque[l - 1][0] = plaque2 / plaque1;
- // savesolution.valeur1[l]=plaque2;
- savesolution.operation[l] = DIV;
- // savesolution.valeur2[l]=plaque1;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- }
- }
- }
- else if (plaque1 >= plaque2)
- {
- plaque[l - 1][0] = plaque1 - plaque2;
- if (plaque[l - 1][0])
- {
- // savesolution.valeur1[l]=plaque1;
- savesolution.operation[l] = SOUS;
- // savesolution.valeur2[l]=plaque2;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- }
- }
- else
- {
- plaque[l - 1][0] = plaque2 - plaque1; // toujours superieur … 0
- savesolution.valeur1[l] = plaque2;
- savesolution.operation[l] = SOUS;
- savesolution.valeur2[l] = plaque1;
- savesolution.resultat[l] = plaque[l - 1][0];
- compte(l - 1);
- }
- }
- }
- }
- int main(int argc, char *argv[])
- {
- int i;
- LARGE_INTEGER Frequence;
- LARGE_INTEGER Compteur1;
- LARGE_INTEGER Compteur2;
- LONGLONG Ecart;
- InitCompteur(&Frequence);
- CompteurOnOff(&Compteur1);
- AffichePresentation();
- if (argc == 8)
- {
- for (i = 0; i<6; i++)
- {
- plaqueini[i] = atol(argv[i + 1]);
- if (plaqueini[i] <= 0)
- AfficheErreurParametres();
- }
- resultat = atol(argv[7]);
- if (resultat <= 0)
- AfficheErreurParametres();
- }
- else
- AfficheErreurParametres();
- for (i = 0; i<6; i++) // v‚rifie que le resultat n'est pas d‚j… dans les 6 nombres
- {
- if (resultat == plaqueini[i])
- {
- printf("Solution d‚j… dans les 6 nombres : %u\n", resultat);
- printf("Appuyer sur une touche pour terminer\n");
- getch();
- return(0);
- }
- }
- for (i = 0; i<6; i++) // initialise plaque[][]
- plaque[6][i] = plaqueini[i];
- meilleurecart = LONG_MAX; //ecart maximal
- meilleurlevel = INT_MAX;
- NombreAppelCompte = 0;
- solutions = 0;
- compte(6);
- if (meilleurecart>0)
- {
- printf("solution la plus proche :\n");
- affichesolution(meilleurlevel);
- }
- printf("\n");
- printf("nombre de solutions : %lu\n", solutions);
- printf("meilleur ‚cart : %lu\n", meilleurecart);
- printf("nombre d'appels … la fonction r‚cursive : %lu \n(= aussi au nombre d'op‚rations 'valides' effectu‚es + 1)\n", NombreAppelCompte);
- CompteurOnOff(&Compteur2);
- Ecart = Compteur2.QuadPart - Compteur1.QuadPart;
- printf("\n");
- printf("TEMPS D'EXECUTION : %f seconde(s) (Frequence de l'horloge : %I64u hz)\n", (double)Ecart / Frequence.QuadPart, Frequence.QuadPart);
- printf("Appuyer sur une touche pour terminer\n");
- getch();
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement