航电ACM [hdu 2012] 素数判定

素数判定

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 69792    Accepted Submission(s): 24176

Problem Description

对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。

Input

输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。

Output

对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

Sample Input

0 1

0 0

Sample Output

OK

分析

1、0 和 1 既不是素数也不是合数,2 是素数

2、大于 2 的数,能被 2 整除的不是素数

3、素数有一个定理:如果 n 不是素数,则 n 有满足 1 < d <= sqrt(n) 的一个因子 d

4、根据以上三条,设计出来的素数算法时间复杂度是 ( sqrt(n) / 2 ),较常规素数算法效率更高些

算法代码

import java.util.Scanner;

public class Main {

    // 素数判定,时间复杂度(sqrt(n)/2)
    private static boolean isPrime(int num) {
        if (num < 2) return false;
        if (num == 2) return true;
        if (num % 2 == 0) return false;
        for (int i = 3; i < Math.sqrt(num); i += 2) {
            if (num % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x, y;
        while (scanner.hasNext()) {
            x = scanner.nextInt();
            y = scanner.nextInt();
            if (x == 0 && y == 0) return;
            boolean flag = true;
            for (; x <= y; x++) {
                if (!isPrime(x * x + x + 41)) flag = false;
            }
            if (flag) System.out.println("OK");
            else System.out.println("Sorry");
        }
    }

}

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值