Q2012
来源:互联网 发布:矩阵 手办 编辑:程序博客网 时间:2024/04/29 20:46
0 10 0
OK
import java.util.Scanner;public class Q2012 {public static void main(String[] args) {Scanner s = new Scanner(System.in);while (s.hasNext()) {int x = s.nextInt();int y = s.nextInt();int n = 0;int count = 0;//计数用int sum = 0;if (x > y || (x == 0 && y == 0))break;for (n = x; n <= y; n++) {sum = n * n + n + 41;if (isPrime(sum)) {count++;}}if (count == (y - x + 1)) //如果素数的个数与范围内(包括边界)的数的个数相等,则输出OK 否则SorrySystem.out.println("OK");elseSystem.out.println("Sorry");}s.close();}static boolean isPrime(int sum) {if (sum < 2 || sum % 2 == 0)return false;if (sum == 2)return true;for (int i = 3; i < sum; i += 2)if (sum % i == 0)return false;return true;}}
这个素数的判断代码是抄袭的。。来自:http://java.e800.com.cn/articles/2010/1110/1289376854382_1.html
/*
1. 根据概念判断:
如果一个正整数只有两个因子, 1和p,则称p为素数.
public boolean isPrime(int n)
{
if(n < 2) return false;
for(int i = 2; i < n; ++i)
if(n%i == 0) return false;
return true;
}
时间复杂度O(n).
2. 改进, 去掉偶数的判断
public boolean isPrime(int n)
{
if(n < 2) return false;
if(n == 2) return true;
if(n%2==0) return false;
for(int i = 3; i < n; i += 2)
if(n%i == 0) return false;
return true;
}
时间复杂度O(n/2), 速度提高一倍.
3. 进一步减少判断的范围
定理: 如果n不是素数, 则n有满足1< d<=sqrt(n)的一个因子d.
证明: 如果n不是素数, 则由定义n有一个因子d满足1< d< n.
如果d大于sqrt(n), 则n/d是满足1< n/d<=sqrt(n)的一个因子.
public boolean isPrime(int n)
{
if(n < 2) return false;
if(n == 2) return true;
if(n%2==0) return false;
for(int i = 3; i*i <= n; i += 2)
if(n%i == 0) return false;
return true;
}
时间复杂度O(Math.sqrt(n)/2), 速度提高O((n-Math.sqrt(n))/2).
4. 剔除因子中的重复判断.
定理: 如果n不是素数, 则n有满足1< d<=Math.sqrt(n)的一个"素数"因子d.
证明: I1. 如果n不是素数, 则n有满足1< d<=Math.sqrt(n)的一个因子d.
I2. 如果d是素数, 则定理得证, 算法终止.
I3. 令n=d, 并转到步骤I1.
由于不可能无限分解n的因子, 因此上述证明的算法最终会停止.
// primes是递增的素数序列: 2, 3, 5, 7, ...
// 更准确地说primes序列包含1->Math.sqrt(n)范围内的所有素数
public boolean isPrime(int primes[], int n)
{
if(n < 2) return false;
for(int i = 0; primes[i]*primes[i] <= n; ++i)
if(n%primes[i] == 0) return false;
return true;
}
*/