题目:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
我的代码:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int N;
cin >> N;
int p[100000],j = 0;
for(int k = 2; k <= N; k++ ){
int i;
for(i = 2; i < k; i++)
if(k % i == 0) break;
if(i > sqrt(k)){
p[j] = k;
j++;
}
}
int num=0;
for(int m = 2; m < j; m++){
if(p[m+1] - p[m] == 2) num++;
}
cout << num;
return 0;
}
五个测试点前四个测试点都是答案正确,就最后一个测试点是运行超时。咱也不知道为啥,咱也不敢问。(?)
别人家的代码:
/*
* 1. 相邻且差为2的素数对 的筛选有两种思路:
* - 判断两个相邻的素数 差值是否为2 (伪)
* - 判断差值为2的两个数是否为素数
* 即使采用第一种思路,但筛选素数本身就是第二种思路。
* 2. 素数有:2、3、5、7...
* 可知,第一对素数对为 (3, 5);
* 由于题目给出数值 <= N,则素数对中较大的数必须<= N;
* 故 以5为起始点,遍历奇数,判断相邻的奇数是否为素数对(除2外,偶数必然非素数)
* 3. 素数的判断方法:奇数n 能被 <= sqrt(n) 的奇数整除,即为素数
*/
#include <stdio.h>
int isPrime(int num) {
for (int i = 3; i * i <= num; i += 2) {//根据能否被 <= sqrt(i) 的奇数整除, 判断素数
if (num % i == 0) {// 能整除,不是素数
return 0;
}
}
return 1;
}
int main() {
int num;
scanf("%d", &num);
int cnt = 0; //对满足条件的素数对计数
for ( int i = 5; i <= num; i += 2) {//遍历从5开始的奇数
if (isPrime(i) && isPrime(i-2)) {// 如果相差2的两个奇数是素数
cnt++;
}
}
printf("%d\n", cnt);
return 0;
}
我是把小于等于N的全部素数都找出来,然后从2开始找临近的素数是否是相差2的;
人家是知道3-5是最小的一个素数对,然后从5开始,看本身和比本身小二的数是否都是素数,一直遍历到N。
虽然我也不知道为啥人家这样运行就不会超时,但是总归是对的吧,那以遇到类似的题后就按照这样的方法进行吧。