题目:
让我们定义
为:
,其中
是第
个素数。显然有
,且对于n>1有
是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10^5),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
思路:
考察素数的判断。
①素数的判断:对每一个正整数i,判断从
区间内,i%j==0是否成立,成立则说明i不是素数break跳出循环,否则判断
,如果成立说明是素数。这段判断素数的代码可以积累下来。
②用c1记录pn,c2记录pn+1,当确定i是素数之后,将其赋予c2,并判断c2-c1==2来判断是不是素数对。
代码:
《C语言版本》
#include<stdio.h>
#include<math.h>
int main(){
int n,i,j,k,num=0,c1=3,c2;
scanf("%d",&n);
for(i=3;i<=n;i++){
k=sqrt(i);
for(j=2;j<=k;j++){
if(i%j==0)
break;
}
if(j>k){
c2=i;
if(i-c1==2)
num++;
c1=i;
}
}
printf("%d",num);
}
《Java语言版本》
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int c1 = 2, c2 = 0, cnt = 0, j;
for(int i = 3;i <= n;i++){
int k = (int) Math.sqrt(i);
for(j = 2;j <= k;j++){
if(i % j == 0){
break;
}
}
if(j > k){
c2 = i;
if(c2 - c1 == 2){
cnt++;
}
c1 = i;
}
}
System.out.print(cnt);
}
}
总结:
1、关键在于判断是不是素数的代码段可以作为常识记忆,即:
for(i=3;i<=n;i++) {
k=sqrt(i);
for(j=2;j<=k;j++){
if(i%j==0)
break; //这个数不是素数,跳出for循环。
}
if(j>k) n++; //是素数,计数加1.
2、sqrt()求开方根的函数在cmath头文件里,不要忘记添加!