Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 KB | None | 0 0
  1. /*
  2. Napisite program koji pronalazi sve mogucnosti stavljanja + ili - ili nista
  3. izmedu brojeva 1, 2, …, 9 (u tom poretku) tako da je rezultat neki zadani cijeli
  4. broj x. Broj x treba ucitati s tipkovnice.
  5.  
  6. Potrebno je ispisati samo koliko postoji takvih mogucnosti.
  7.  
  8. Primjer:
  9. Input: 100
  10. Output: 11
  11. ...zato sto postoji 11 kombinacija kojima se moze dobiti broj 100.
  12. Jedno od tih 11 rjesenja je npr.
  13. 1 + 2 + 3 - 4 + 5 + 6 + 78 + 9 = 100
  14. */
  15.  
  16. #include<iostream>
  17. using namespace std;
  18.  
  19. // stavi "True" da ti ispise rjesenja
  20. // ostavi "False" da samo ispise broj rjesenja
  21. const bool debug = false;
  22.  
  23.  
  24. // racuna potenciju a^n
  25. int power(int a, int n) {
  26.     int rez = 1;
  27.     for (int i = 0; i<n; i++) {
  28.         rez *= a;
  29.     }
  30.     return rez;
  31. }
  32.  
  33. // pretvara broj c u zapis u bazi 3 i sprema u C[]
  34. void makeCombo(int c, int C[]) {
  35.    
  36.     // pupuni C[] s nulama; "resetiraj ga"
  37.     for (int i = 0; i<8; i++) {
  38.         C[i] = 0;  
  39.     }
  40.      
  41.     // dodaj znamenke c u bazi 3
  42.     int digit = 0;
  43.     while (c != 0) {
  44.         C[digit] = c % 3;
  45.         c /= 3;
  46.         digit++;
  47.     }
  48. }
  49.  
  50. // testiraj kombinaciju
  51. bool testCombo(int C[], int x, bool print) {
  52.     int a = 9; // znamenka
  53.     int sum = 0; // rezultat
  54.     int concatenator = 0;
  55.     int concatenation = 0;
  56.    
  57.     // 8 operacija stane izmedu "1 2 3 4 5 6 7 8 9"
  58.     // pregledava kombinaciju unazad da prvo "pridruzi" znamenke "nista" operatorom
  59.     // zatim naide na "-" ili "+" ispred njih te moze pridruzene znamenke samo oduzet/pribrojit
  60.     for (int i = 0; i < 8; i++) {
  61.        
  62.         // "concatenation" operacija (ab) pridruzivanja
  63.         if (C[7-i] == 0) {
  64.             // spremam pridruzene znamenke u "concatenator" jer neznam dali je + ili - ispred broja jos
  65.             // brojim "concatenation" da znam na kojem sam mjestu (jedinice, desetice, stotice...)
  66.             concatenator += a*power(10,concatenation);
  67.             concatenation++;
  68.            
  69.         // dodaj "plus" operaciju znamenci (a+b), i rijesi concatenation (+) jer sam naisao na plus
  70.         } else if (C[7-i] == 1) {
  71.             sum += a*power(10,concatenation); // treutna znamenka a, puta (jedinice, desetice, stotice...)
  72.             sum += concatenator; // ostatak pridruzih znamenki spremljene u "concatenator"
  73.             concatenator = 0;
  74.             concatenation = 0;
  75.            
  76.         // dodaj "minus" operaciju znamenci (a-b), i rijesi concatenation (-) jer sam naisao na minus
  77.         } else if (C[7-i] == 2) {
  78.             sum -= a*power(10,concatenation); // treutna znamenka a, puta (jedinice, desetice, stotice...)
  79.             sum -= concatenator; // ostatak pridruzih znamenki spremljene u "concatenator"
  80.             concatenator = 0;
  81.             concatenation = 0;
  82.         }
  83.         a--;
  84.     }
  85.     // dolazim do zadnje znamenke 1, te sam izaso is for petlje jer neam operator ispred 1
  86.     // zato mogu samo izvrsit "+" dodavanje jer je 1 pozitivan (nema minus ispred)
  87.     // isto tako probrojit pridruzene znamenke jedinici na koje sam dosad naiso
  88.     sum += a*power(10,concatenation);
  89.     sum += concatenator;
  90.  
  91.     // ispisi rjesenja radi provjere? /////
  92.     if (print and sum == x) {
  93.         for (int i=0; i<8; i++) {
  94.             if (C[i] == 0) {
  95.                 cout << i+1 << "";
  96.             } else if (C[i] == 1) {
  97.                 cout << i+1 << "+";
  98.             } else if (C[i] == 2) {
  99.                 cout << i+1 << "-";
  100.             }
  101.         }
  102.         cout << 9;
  103.         cout << "=" << sum << " " << endl;
  104.     }
  105.     //////////////////////////////////////
  106.    
  107.     return (sum == x);
  108. }
  109.  
  110. int main() {
  111.     int x, count = 0;
  112.     cin >> x;
  113.  
  114.     // Primjetimo da 8 operacija stane između brojeva "1 2 3 4 5 6 7 8 9"
  115.     // Isto tako, imamo 3 operacje: "+", "-"", ili "nista" tj. "concatenation" = spajanje brojeva u prijevodu)
  116.     // Dakle, postoji 3^8 mogucih kombinacija koje treba provjeriti
  117.     // Oznacimo "nista" sa 0, "+" sa 1, "-" sa 2 ...
  118.     // ... dakle, mozemo brojati u bazi 3 do 3^8 da prodemo sve kombinacije
  119.     int combo = 0;
  120.     int C[8] = {0,0,0,0,0,0,0,0};
  121.     while (combo < power(3,8)) {
  122.         // makeCombo pretvori brojac "combo" u broj u bazi 3, npr: kombinacija 553 = 00202111
  123.         // testCombo zamjeni 0,1,2 sa "nista", "+", "-" i stavi izmedu brojeva 123456789, te izracuna kombinaciju
  124.         // npr: kombinacija 553 je uzeta kao 00202111 = 123-45-6+7+8+9 = 96
  125.         // ... vrati true ako je rjesenje kombinacije jednako x
  126.         makeCombo(combo, C);
  127.         if (testCombo(C, x, debug)) { count++; }
  128.         combo++;
  129.     }
  130.    
  131.     cout << count << endl;
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement