Java每日一练07判断完美数

Java每日一练07判断完美数,第1张

Java每日一练07判断完美数

Java每日一练07
  • 判断完美数
  • 多线程打印0和奇偶数

判断完美数
import java.util.HashSet;

public class s05 {
    public static void main(String[] args) {
        boolean b = Solution.checkPerfectNumber(28);
        System.out.println(b); // true
    }
}


class Solution {
    
    public static boolean checkPerfectNumber(int num) { // 28
        
        if (num < 4) return false;
        int sum = 0;
        HashSet set = new HashSet<>();

        for (int i = 1; i <= num - 1; i++) {
            if ((num % i) == 0 && !set.contains(i) && !set.contains(num / i)) {
                set.add(i);
                set.add(num / i);
                sum += i;
                sum += num / i;
            }
        }
        sum -= num;
        return sum == num;
    }
}
多线程打印0和奇偶数
package ckwd.ps;

import java.util.concurrent.Semaphore;
import java.util.function.IntConsumer;

public class MultiThreadOddEvenZeroTest01 {
}

class ZeroOddEvenTest {
    public static void main(String[] args) {
        ZeroEvenOdd zeroEvenOdd = new ZeroEvenOdd(21);

        new Thread(() -> {
            try {
                zeroEvenOdd.zero(System.out::print);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            try {
                zeroEvenOdd.even(System.out::print);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            try {
                zeroEvenOdd.odd(System.out::print);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}


class ZeroEvenOdd {
    private int n;
    private Semaphore zero = new Semaphore(1);
    private Semaphore even = new Semaphore(0);
    private Semaphore odd = new Semaphore(0);

    public ZeroEvenOdd(int n) {
        this.n = n;
    }

    public void zero(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n; i++) {
            zero.acquire(); // 取走1个许可证,代码往下执行
            printNumber.accept(0); // 输出0
            if (i % 2 == 1) {
                odd.release(); // 第1次会给odd信号量1个许可证
            } else {
                even.release();
            }
        }
    }

    public void even(IntConsumer printNumber) throws InterruptedException {
        for (int i = 2; i <= n; i += 2) {
            even.acquire();
            printNumber.accept(i);
            zero.release();
        }
    }

    public void odd(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n; i += 2) {
            odd.acquire(); // 第1次得到zero方法给的许可证后,代码继续往下执行
            printNumber.accept(i); // 输出1,i目前是1
            zero.release(); // 再给zero信号量1个许可证
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5686513.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存