郑轻工 3097. 筛质数 + 二分 = 小模拟

import java.util.Arrays;
import java.util.Scanner;

class Main {
    static int[] pri = new int[100];
    static int idx;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int x = sc.nextInt();
        init();

//        System.out.println(nearprime(x));
//        System.out.println(nearprime(97 - x));

        System.out.println(nearprime(x) * nearprime(97 - x));
    }

    private static void init() {
        for (int i = 2; i <= 100; i ++ ) {
            int now = i;
            boolean f = true;
            for (int j = 2; j <= now / j; j ++ ) {
                if (now % j == 0) f = false;
            }

            if (f) pri[idx ++ ] = now;
        }
    }

    private static int nearprime(int x) {
        int fl = 0, fr = idx - 1;
        while (fl < fr) {
            int mid = fl + fr + 1 >> 1;
            if (pri[mid] <= x) fl = mid;
            else fr = mid - 1;
        }

        int sl = 0, sr = idx - 1;
        while (sl < sr) {
            int mid = sl + sr >> 1;
            if (pri[mid] >= x) sr = mid;
            else sl = mid + 1;
        }

        int dx = 0x3f3f3f3f;
        if (pri[fl] <= x) dx = Math.abs(x - pri[fr]);
        int dy = 0x3f3f3f3f;
        if (pri[sl] >= x) dy = Math.abs(x - pri[sr]);

//        if (x == 15) {
//            System.out.println("debug dx -> " + dx);
//            System.out.println("debug dy -> " + dy);
//        }

        if (dx <= dy) return pri[fl];
        return pri[sr];
    }
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值