Advertisement
imarosi

szamsor_pluszminusz

May 31st, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. /*
  6. Tekintsünk egy egészekbők álló számsort. A számok közé a + és - jelet tehetjük.
  7. A műveleti jelek választásától függően számtalan végeredményt állíthatunk elő.
  8. A 17, 5, -21, 15 számokat tekintve az alábbi eredményre juthatunk.
  9. 17 + 5 + -21 + 15 = 16
  10. 17 + 5 + -21 - 15 = -14
  11. 17 + 5 - -21 + 15 = 58
  12. 17 + 5 - -21 - 15 = 28
  13. 17 - 5 + -21 + 15 = 6
  14. 17 - 5 + -21 - 15 = -24
  15. 17 - 5 - -21 + 15 = 48
  16. 17 - 5 - -21 - 15 = 18
  17. Egy ilyen számsort D-vel oszthatónak nevezünk, ha van olyan műveletsor,
  18. amelynek eredménye D-vel osztható. A fenti számsor ennek megfelelően osztható 7-tel,
  19. de nem osztható 5-tel.
  20. Feladat:
  21. Írj programot, amely megállapítja, hogy egy számsor osztható-e egy adott számmal.
  22.  
  23. Bemenet:
  24. A bemeneti állomány N tesztesetet tartalmaz. Az állomány első sorában az N értéke kap helyet.
  25. A tesztesetek első sorában két egész szám található egyetlen szóközzel elválasztva, a K és a D.
  26. (1<=K<=10000, 2<=D<=100). A teszteset második sorában K darab egész szám szerepel, köztük
  27. szóközök vannak. Minden egész 10000-nél nem nagyobb abszolútértékű.
  28.  
  29. Kimenet:
  30. A kimeneti állományba tesztesetenként egyetlen szót kell írni: "Divisible", ha a végeredmények
  31. közül bármelyik osztható D-vel, illetve "Not divisible", ha a végeredmények közül egyetlen szám
  32. sem osztható D-vel.
  33.  
  34.  */
  35.  
  36. bool van_e_oszthato_variacio(int osszeg, int *szamok, int k, int d)
  37. {
  38.     // Rekurziv fuggveny: eddig mar valahany szam variacioi megszulettek, azok
  39.     // pluszos vagy minuszos osszege az elso parameter. Azon kivul meg k darabot kell
  40.     // minden variacioban kiprobalni, azok kozul az elsore a szamok pointer mutat.
  41.  
  42.     if (k == 0) {
  43.         // minden szamot osszeadtunk (illetve kivontunk), oszthato-e d-vel?
  44.         return (osszeg % d == 0);
  45.     }
  46.  
  47.     // megprobaljuk a kovetkezo szamot hozzaadni. Sikerul-e ugy valamelyik folytatas?
  48.     // A folytatas: szamok+1 helyen van a kovetkezo k-1 darab szam, amit varialni kell
  49.     int vane = van_e_oszthato_variacio(osszeg + *szamok, szamok+1, k-1, d);
  50.     if (vane)
  51.         return true;    // sikerult, nem is kell tovabb csinalni a rekurziot
  52.  
  53.     // megprobaljuk a kovetkezo szamot kivonni. Sikerul-e ugy valamelyik folytatas?
  54.     return van_e_oszthato_variacio(osszeg - *szamok, szamok+1, k-1, d);
  55. }
  56.  
  57. int main()
  58. {
  59.     FILE *input = fopen("bemenet.txt", "r");
  60.     if (!input) {
  61.         printf("Nincs bemenet.txt\n");
  62.         exit(1);
  63.     }
  64.  
  65.     FILE *output = fopen("kimenet.txt", "w");
  66.     if (!output) {
  67.         printf("Nem tudom letrehozni: kimenet.txt\n");
  68.         exit(1);
  69.     }
  70.  
  71.     // Elso sor: tesztszetek szama
  72.     int n = 0;
  73.     fscanf(input, "%d", &n);
  74.  
  75.     for (int szet=0; szet<n; szet++) {
  76.         // Tesztszet elso sora: szamok darabszama, oszto
  77.         int k=0, d=0;
  78.         fscanf(input, "%d %d", &k, &d);
  79.  
  80.         // Masodik sor: a K darab szam, max 10000
  81.         int szamok[10000];
  82.         for (int i=0; i<k; i++)
  83.             fscanf(input, "%d", &szamok[i]);
  84.  
  85.         if (van_e_oszthato_variacio(0, szamok, k, d)) {
  86.             fprintf(output, "Divisible\n");
  87.         } else
  88.             fprintf(output, "Not divisible\n");
  89.     }
  90.  
  91.     fclose(input);
  92.     fclose(output);
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement