Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.HashSet;
- import java.util.Set;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.TimeUnit;
- public class Main {
- public static void main(String[] args) throws InterruptedException {
- //Создаем потоки-исполнители
- ExecutorService service = Executors.newFixedThreadPool(10);
- //Непосредственно само решение к заданию https://otvet.mail.ru/question/229057174
- for(int i=0; i<10; i++) {
- //Добавляем наши таски в потоки
- service.submit(new Task(35_000_000 + 500_000 * i, 35_500_000 + 500_000 * i));
- }
- long time = System.currentTimeMillis();
- //Запускает потоки-исполнители
- service.shutdown();
- service.awaitTermination(1, TimeUnit.DAYS);
- System.out.println(System.currentTimeMillis()-time + "ms");
- }
- //Функция для поиска делителей, n - число, делители которого ищем
- public static Set<Integer> divs(int n) {
- //Создаем множество, где будут только уникальные делители, ведь нам не нужен повтор, если число будет нацело извлекаться из корня
- Set<Integer> divs = new HashSet<>();
- //Итерируем до корня из числа, почему так: читать *¹ https://otvet.mail.ru/question/229057174
- for(int i=1; i <= Math.sqrt(n); i++)
- //Проверяем, делится ли наше число n на число i, посредством получения остатка (число будет делиться на число нацело, если остаток равен 0)
- if(n % i == 0) {
- //Если n делится на i, тогда мы заносим это число во множество
- divs.add(i);
- //Заносим вторую пару от деления, читать *² https://otvet.mail.ru/question/229057174
- divs.add(n / i);
- }
- //Возращаем наши делители
- return divs;
- }
- }
- class Task implements Runnable {
- private final int a, b;
- public Task(int a, int b) {
- this.a = a;
- this.b = b;
- }
- @Override
- public void run() {
- task(a, b);
- }
- //Задача для 1 потока, делим наши 5 миллионов чисел на 10 задач по 500 тысяч чисел
- public void task(int a, int b) {
- for(int i=a; i<=b; i++) {
- Set<Integer> divs = Main.divs(i);
- int neChet = 0;
- for(int n : divs) {
- if (n % 2 != 0)
- neChet++;
- if(neChet > 5)
- break;
- }
- if(neChet == 5)
- System.out.println(i);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement