visoft

Moneda_Falsa

Dec 13th, 2019
166
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int suma_monede(int*monede, int nr, int start, int end){
  5.     // [start, end)
  6.     if((start < 0) || (end > nr) || (start >= end)){
  7.         printf("erorare la parametri %d %d",start, end);
  8.         return -1;
  9.     }
  10.     int suma=0;
  11.     for(int i = start;i<end;i++){
  12.         suma += monede[i];
  13.     }
  14.     return suma;
  15. }
  16.  
  17. int compara(int*monede, int nr, int start1, int end1, int start2, int end2){
  18.     if((end1-start1) != (end2-start2)){
  19.         printf("Eroare la parametri %d %d %d %d", start1, end1, start2, end2);
  20.         return 0;
  21.     }
  22.     int suma1,suma2;
  23.     suma1 = suma_monede(monede, nr, start1, end1);
  24.     suma2 = suma_monede(monede, nr, start2, end2);
  25.     return suma1 - suma2;
  26. }
  27.  
  28. int gaseste_moneda(int*monede, int nr, int start, int end){
  29.     // [start, end)
  30.     // recursiva!!!
  31.     printf("Testez intre [%d, %d)\n",start, end);
  32.     if (start == end){
  33.         printf("Eroare, start == end, %d",start);
  34.         return -1;
  35.     }
  36.     if (start == end - 1){
  37.         printf("Moneda gresita este: %d\n", start);
  38.         return 0;
  39.     }
  40.     int nr_crt = end - start;
  41.     if (nr_crt == 2){
  42.         int c = compara(monede, nr, start, start+1, start+1, end);
  43.         if (c < 0){
  44.             printf("Moneda gresita este %d\n", start);
  45.             return 0;
  46.         }
  47.         if (c > 0){
  48.             printf("Moneda gresita este %d\n", start+1);
  49.             return 0;
  50.         }
  51.         if (c == 0){
  52.             printf("Eroare,cele doua monede sunt identice, %d\n",start);
  53.             return -1;
  54.         }
  55.     }//end if nr == 2
  56.  
  57.     if(nr_crt % 2 == 0){
  58.         int mijloc = (start+end) / 2;
  59.         int c = compara(monede, nr, start, mijloc, mijloc, end);
  60.         if (c == 0){
  61.             printf("Eroare,cele doua monede sunt identice, %d %d\n",start, end);
  62.             return -1;
  63.         }
  64.         if (c < 0){
  65.             return gaseste_moneda(monede, nr, start, mijloc);
  66.         }
  67.         if (c > 0){
  68.             return gaseste_moneda(monede, nr, mijloc, end);
  69.         }
  70.     }
  71.     if(nr_crt % 2 == 1){
  72.         int end2 = end - 1;
  73.         int mijloc = (start + end2) / 2;
  74.         int c = compara(monede, nr, start, mijloc, mijloc, end2);
  75.         if (c == 0){
  76.             printf("Moneda gresita este %d\n", end2);
  77.             return 0;
  78.         }
  79.         if (c < 0){
  80.             return gaseste_moneda(monede, nr, start, mijloc);
  81.         }
  82.         if (c > 0){
  83.             return gaseste_moneda(monede, nr, mijloc, end);
  84.         }
  85.     }
  86.     printf("NU AM LUAT NICI UN CAZ");
  87.     return -100;
  88. }
  89.  
  90.  
  91. int main(void) {
  92.     int monede[] ={10, 10, 10, 10, 9};
  93.     int nr_monede = sizeof(monede) / sizeof(int);
  94.  
  95.  
  96.     int s=gaseste_moneda(monede, nr_monede, 0, nr_monede);
  97.     printf("rezultat apel = %d",s);
  98.  
  99. //  int s=compara(monede, nr_monede, 0, 2, 2, 4 );
  100. //  printf("suma = %d",s);
  101. //  int s=suma_monede(monede, nr_monede, 1, 2);
  102. //  printf("suma = %d",s);
  103. //  for(int i=0;i<nr_monede;i++){
  104. //      printf("%c ",monede[i]);
  105. //  }
  106.  
  107.     return EXIT_SUCCESS;
  108. }
RAW Paste Data