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

判断完美数

import java.util.HashSet;

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

/*
 * 示例 1:
 * 输入:num = 28
 * 输出:true
 * 解释:28 = 1 + 2 + 4 + 7 + 14
 * 1, 2, 4, 7, 和 14 是 28 的所有正因子
 */
class Solution {
    /**
     * 判断完美数
     *
     * @param num 指定判断的数
     * @return
     * 是完美数     true
     * 不是完美数   false
     */
    public static boolean checkPerfectNumber(int num) { // 28
        /*
         * 程序运行到此处
         * 假设num值是28
         * 第一次for循环的时候把
         * 1和28推进去
         * 第2次循环的时候把
         * 2和14推进去
         * ... ...
         * 一直到循环结束
         * set集合种保留的应该是
         * 28的全部正因子
         * 再减去28本身
         * 判断减去后的结果是否与28相等
         * 相等就是完美数
         */
        if (num < 4) return false;
        int sum = 0;
        HashSet<Integer> 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();
    }
}

/**
 * 输出方法
 * @author 驳壳毛瑟
 * @apiNote
 * accept
 *      打包输出1个int类型的整数
 * IntConsumer
 *      指定int类型的整数
 */
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个许可证
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muskfans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值