Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <thread>
- #include <cmath>
- #include <vector>
- using ulli = unsigned long long int;
- bool isSuperPerfect(const ulli number)
- {
- ulli result = 1;
- const int sqrtNumber = static_cast<int>(sqrt(number));
- for(auto i=1; i <= sqrtNumber; i++)
- {
- if(number % i == 0)
- {
- auto divs = number / i;
- result += (i == divs) ? i : (i + divs);
- }
- }
- return result == (2 * number);
- }
- void findPerfects(const ulli left, const ulli right, const int intervalSize, std::vector<ulli> &numbers)
- {
- for(auto i=left; i<=right; i += intervalSize)
- {
- if(isSuperPerfect(i))
- {
- numbers.push_back(i);
- }
- }
- }
- std::vector<ulli> getPerfects(const ulli left, const ulli right, const int numberThreads)
- {
- std::vector<ulli> numbers;
- std::vector<std::thread> allThreads(numberThreads);
- for(auto i=1; i<=numberThreads; i++)
- {
- std::thread currentThread(findPerfects, left, right, numberThreads, std::ref(numbers));
- allThreads.push_back(currentThread);
- }
- // wait to finish
- for(auto i=1; i<=numberThreads; i++)
- {
- allThreads[i].join();
- }
- return numbers;
- }
- int main()
- {
- std::vector<ulli> numbers = getPerfects(11, 2000, 4);
- for(int i : numbers)
- {
- std::cout << i << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment