crsandu

Untitled

Mar 24th, 2021
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <cmath>
  4. #include <vector>
  5.  
  6. using ulli = unsigned long long int;
  7. bool isSuperPerfect(const ulli number)
  8. {
  9. ulli result = 1;
  10. const int sqrtNumber = static_cast<int>(sqrt(number));
  11. for(auto i=1; i <= sqrtNumber; i++)
  12. {
  13. if(number % i == 0)
  14. {
  15. auto divs = number / i;
  16. result += (i == divs) ? i : (i + divs);
  17. }
  18. }
  19. return result == (2 * number);
  20. }
  21.  
  22. void findPerfects(const ulli left, const ulli right, const int intervalSize, std::vector<ulli> &numbers)
  23. {
  24. for(auto i=left; i<=right; i += intervalSize)
  25. {
  26. if(isSuperPerfect(i))
  27. {
  28. numbers.push_back(i);
  29. }
  30. }
  31. }
  32.  
  33. std::vector<ulli> getPerfects(const ulli left, const ulli right, const int numberThreads)
  34. {
  35. std::vector<ulli> numbers;
  36. std::vector<std::thread> allThreads(numberThreads);
  37. for(auto i=1; i<=numberThreads; i++)
  38. {
  39. std::thread currentThread(findPerfects, left, right, numberThreads, std::ref(numbers));
  40. allThreads.push_back(currentThread);
  41. }
  42.  
  43. // wait to finish
  44. for(auto i=1; i<=numberThreads; i++)
  45. {
  46. allThreads[i].join();
  47. }
  48. return numbers;
  49. }
  50.  
  51. int main()
  52. {
  53. std::vector<ulli> numbers = getPerfects(11, 2000, 4);
  54. for(int i : numbers)
  55. {
  56. std::cout << i << " ";
  57. }
  58. return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment