题目描述:
1007 素数对猜想 (20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
分析:
主要是把N以内的素数求出来,并放在一个数组里。最后进行一次判断,如果相邻两个素数差为2,则计数器加一。
但是我的程序,最后一个测试点始终通不过。满分20分,我只能获得18分。
结果:
提交时间 | 状态 | 分数 | 题目 | 编译器 | 耗时 | 用户 |
---|---|---|---|---|---|---|
2019/1/15 14:49:56 | 部分正确 |
18 | 1007 | C++ (g++) | 24 ms | 方人也几点 |
测试点 | 结果 | 耗时 | 内存 |
---|---|---|---|
0 | 答案正确 | 6 ms | 380 KB |
1 | 答案正确 | 5 ms | 380 KB |
2 | 答案正确 | 5 ms | 512 KB |
3 | 答案正确 | 7 ms | 508 KB |
4 | 答案正确 | 4 ms | 368 KB |
5 | 答案错误 | 24 ms | 512 KB |
程序:
#include<iostream>
#include<math.h>
using namespace std;
/*judge if n is a prime number*/
bool judge(int n){
if(n<3) return n>1;
else{
for(int i=2;i<=sqrt(n);i++)
if(n%i == 0) return false;//可以整除,说明不是素数
return true;
}
}
int main(){
int n,a[100010],k=0;
int jug,counter=0;//counter for counting
cin>>n;
for(int i=1;i<=n;i++){
jug = judge(i);
if(jug == true)
a[k++] = i;
}
/*output*/
for(int i=0;i<n+1;i++){
if(a[i+1]-a[i] == 2) counter++;
}
cout<<counter;
return 0;
}