地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=26
孪生素数问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
-
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
-
输入
-
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
- 每组测试数据输出占一行,该行为m范围内所有孪生素数组数。 样例输入
-
1 14
样例输出
-
4
-
第一行给出N(0<N<100)表示测试数据组数。
思路:很简单,就是找到范围内的素数表后,将相邻的质数相减,==2/==1是孪生数。而我却在怎么让相邻的两个数之间相减中,debug了很久。自己的逻辑很混乱,很是很简单,但是现实出来却不简单。。。
直接上源码吧:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
while(n-->0){
int m=cin.nextInt();
findTwinNum(m);
}
}
//1212 20223 这道题是debug出来的,很痛苦啊,在怎么让相邻两个相减,以为很简单,结果很不一般
public static void findTwinNum(int m){
int [] primes=new int[m+1];
for(int i=2;i<=Math.sqrt(m);i++){ //只需取到根号之前,包括根号的值就够了。原理与用根号求素数一样
if(primes[i]==0)
for(int j=2;i*j<=m;j++)
primes[i*j]=1; //非质数=1
}
int tmp=m;
int a=0,b=0,account=0;
while(tmp>2){ //这里不能=2,他不能是被减数
if(primes[tmp]!=1){ //tmp而不是tmp-1重用上一个减数变为被减数
a=tmp;
while(tmp>=2) //但是可以成为减数
if(primes[--tmp]!=1){ //找到下一个跳出
b=tmp;
break;
}
if(a-b==2||a-b==1)
account++;
}
else
tmp--;
}
System.out.println(account);
}
}