Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <ctime>
- #include <omp.h>
- using namespace std;
- int sum, a, b, c, ld, lj, poLewej = 4, licz = 0, licz_operacje = 0;
- string aS, bS, cS, liczba;
- int main()
- {
- string s("0123456789"); // string ze wszystkimi możliwymi cyframi
- double start = omp_get_wtime(); //pomiar czasu
- for (int i = 0; i < 99; i++) // pętla która będzie służyć do ustawiania liczby coś/coś + licznik = 100
- {
- c = 98 - i; //odejmowanie od maksymalnej możliwej cyfry na sumie czyli 98
- if (c > 9 && c % 11 != 0) // sprawdzenie czy suma (ten + ) jest większy od 9 i nie jest podzielny przez 11, zawężam wtedy liczby ponieważ nie może być 11,22 itd
- {
- liczba = to_string(c); // rzutowanie tego + na string
- ld = (liczba.at(0)) - '0'; // pobranie ze string cyfry dziesiątek
- lj = (liczba.at(1)) - '0'; // pobranie ze stringa cyfry jedności
- if (ld > lj) // jeśli cyfra dziesiątek jest większa od cyfry jedności
- {
- s.erase(ld, 1); // to ze stringa z dostępnymi cyframi usuń najpierw cyfrę dziesiątek
- s.erase(lj, 1); // następnie cyfrę jedności
- }
- else
- {
- s.erase(lj, 1); // w przeciwnym wypadku usuń najpierw liczbę jedności, te założenia są w celu nie pomieszania kolejności w stringu, to znaczy żeby było po koleji
- s.erase(ld, 1);
- }
- }
- else if (c % 11 != 0) // tutaj wiemy że przy działaniu cos/cos + jest liczba poniżej 10 więc usuwam ze stringa tylko jedną cyfre
- {
- s.erase(c, 1);
- poLewej = 5; // zmienna użyta w tym celu aby zmniejszyć ilość wykonywanych działań, ponieważ gdy na + będzie jedna cyfra wtedy mamy przypadek np. 012345678, przez co wimey że po lewej stronie dzielenia musi być conajmniej pięc liczb ponieważ mniejsza ilość nie da liczby całkowitej z dzielenia
- }
- else
- continue;
- //cout << endl << s << " Petla nr. " << i << endl << endl;
- for (int k = 1; k < 3; k++) // Pętla w celu, gdy k = 2, usuwa 0 i dodaje do "c" (do +)
- {
- if (k == 2)
- {
- if (c % 10 == 0) // jeśli + jest liczbą np. 90 to nie ma sensu na nowo liczyć
- continue;
- s.erase(0, 1);
- cS = "0" + to_string(c);
- poLewej = 4;
- }
- else
- cS = to_string(c);
- do {
- #pragma omp parallel for schedule(dynamic, 4) num_threads(8)
- for (int j = poLewej; j < s.length(); j++) // pętla której zadaniem jest dzielenie i sprawdzanie 8 dostępnych liczb dla danej permutacji
- {
- b = stoi(s.substr(j, s.length())); // rzutowanie do inta stringa, pobieranie w zależności od liczby przy +, jest to mianownik
- if (b != 0) // sprawdzenie żeby nie wystąpiło dzielenie przez 0
- {
- a = stoi(s.substr(0, j)); // pobranie licznika cyfr po lewej stronie permutacji
- if ((a > b) && (a%b == 0)) // założenie że licznik musi być większy od mianownika oraz dający liczbę całkowitą
- {
- sum = 0;
- sum = (a / b) + c; // wyliczanie dla podanego przypadku
- if (sum == 100) // sprawdzanie sumy
- {
- cout << s.substr(0, j) << " / " << s.substr(j, s.length()) << " + " << cS << " = " << "100" << endl; // wypisanie na ekran przypadku
- cout << "Watek: " << omp_get_thread_num() << endl;
- licz++;
- }
- }
- }
- }
- licz_operacje++;
- } while (next_permutation(s.begin(), s.end()));
- if (k == 2)
- {
- s.insert(0, "0");
- }
- }
- if (c > 9)// dodawanie do stringa pobranych cyfr z +, w odpowiedniej kolejności
- {
- if (ld < lj)
- {
- s.insert(ld, to_string(ld));
- s.insert(lj, to_string(lj));
- }
- else
- {
- s.insert(lj, to_string(lj));
- s.insert(ld, to_string(ld));
- }
- }
- else
- s.insert(c, to_string(c));
- }
- double stop = omp_get_wtime();
- cout << "Czas wykonania: " << (stop - start) << endl;
- cout << "Operacje: " << licz_operacje << endl;
- cout << "Result: " << licz;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement