Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Napisite program koji pronalazi sve mogucnosti stavljanja + ili - ili nista
- izmedu brojeva 1, 2, …, 9 (u tom poretku) tako da je rezultat neki zadani cijeli
- broj x. Broj x treba ucitati s tipkovnice.
- Potrebno je ispisati samo koliko postoji takvih mogucnosti.
- Primjer:
- Input: 100
- Output: 11
- ...zato sto postoji 11 kombinacija kojima se moze dobiti broj 100.
- Jedno od tih 11 rjesenja je npr.
- 1 + 2 + 3 - 4 + 5 + 6 + 78 + 9 = 100
- */
- #include<iostream>
- using namespace std;
- // stavi "True" da ti ispise rjesenja
- // ostavi "False" da samo ispise broj rjesenja
- const bool debug = false;
- // racuna potenciju a^n
- int power(int a, int n) {
- int rez = 1;
- for (int i = 0; i<n; i++) {
- rez *= a;
- }
- return rez;
- }
- // pretvara broj c u zapis u bazi 3 i sprema u C[]
- void makeCombo(int c, int C[]) {
- // pupuni C[] s nulama; "resetiraj ga"
- for (int i = 0; i<8; i++) {
- C[i] = 0;
- }
- // dodaj znamenke c u bazi 3
- int digit = 0;
- while (c != 0) {
- C[digit] = c % 3;
- c /= 3;
- digit++;
- }
- }
- // testiraj kombinaciju
- bool testCombo(int C[], int x, bool print) {
- int a = 9; // znamenka
- int sum = 0; // rezultat
- int concatenator = 0;
- int concatenation = 0;
- // 8 operacija stane izmedu "1 2 3 4 5 6 7 8 9"
- // pregledava kombinaciju unazad da prvo "pridruzi" znamenke "nista" operatorom
- // zatim naide na "-" ili "+" ispred njih te moze pridruzene znamenke samo oduzet/pribrojit
- for (int i = 0; i < 8; i++) {
- // "concatenation" operacija (ab) pridruzivanja
- if (C[7-i] == 0) {
- // spremam pridruzene znamenke u "concatenator" jer neznam dali je + ili - ispred broja jos
- // brojim "concatenation" da znam na kojem sam mjestu (jedinice, desetice, stotice...)
- concatenator += a*power(10,concatenation);
- concatenation++;
- // dodaj "plus" operaciju znamenci (a+b), i rijesi concatenation (+) jer sam naisao na plus
- } else if (C[7-i] == 1) {
- sum += a*power(10,concatenation); // treutna znamenka a, puta (jedinice, desetice, stotice...)
- sum += concatenator; // ostatak pridruzih znamenki spremljene u "concatenator"
- concatenator = 0;
- concatenation = 0;
- // dodaj "minus" operaciju znamenci (a-b), i rijesi concatenation (-) jer sam naisao na minus
- } else if (C[7-i] == 2) {
- sum -= a*power(10,concatenation); // treutna znamenka a, puta (jedinice, desetice, stotice...)
- sum -= concatenator; // ostatak pridruzih znamenki spremljene u "concatenator"
- concatenator = 0;
- concatenation = 0;
- }
- a--;
- }
- // dolazim do zadnje znamenke 1, te sam izaso is for petlje jer neam operator ispred 1
- // zato mogu samo izvrsit "+" dodavanje jer je 1 pozitivan (nema minus ispred)
- // isto tako probrojit pridruzene znamenke jedinici na koje sam dosad naiso
- sum += a*power(10,concatenation);
- sum += concatenator;
- // ispisi rjesenja radi provjere? /////
- if (print and sum == x) {
- for (int i=0; i<8; i++) {
- if (C[i] == 0) {
- cout << i+1 << "";
- } else if (C[i] == 1) {
- cout << i+1 << "+";
- } else if (C[i] == 2) {
- cout << i+1 << "-";
- }
- }
- cout << 9;
- cout << "=" << sum << " " << endl;
- }
- //////////////////////////////////////
- return (sum == x);
- }
- int main() {
- int x, count = 0;
- cin >> x;
- // Primjetimo da 8 operacija stane između brojeva "1 2 3 4 5 6 7 8 9"
- // Isto tako, imamo 3 operacje: "+", "-"", ili "nista" tj. "concatenation" = spajanje brojeva u prijevodu)
- // Dakle, postoji 3^8 mogucih kombinacija koje treba provjeriti
- // Oznacimo "nista" sa 0, "+" sa 1, "-" sa 2 ...
- // ... dakle, mozemo brojati u bazi 3 do 3^8 da prodemo sve kombinacije
- int combo = 0;
- int C[8] = {0,0,0,0,0,0,0,0};
- while (combo < power(3,8)) {
- // makeCombo pretvori brojac "combo" u broj u bazi 3, npr: kombinacija 553 = 00202111
- // testCombo zamjeni 0,1,2 sa "nista", "+", "-" i stavi izmedu brojeva 123456789, te izracuna kombinaciju
- // npr: kombinacija 553 je uzeta kao 00202111 = 123-45-6+7+8+9 = 96
- // ... vrati true ako je rjesenje kombinacije jednako x
- makeCombo(combo, C);
- if (testCombo(C, x, debug)) { count++; }
- combo++;
- }
- cout << count << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement