让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
代码:
思路就是题干的描述。使用C++(clang+)编译器提交代码
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,cha;
cin>>n;
int a=2; //保存的是前一个素数的值
int num=0;
int flag=0;
for(int i=3;i<=n;i++){
for(int j=2;j<=sqrt(i);j++)
if(i%j==0){ //不是素数
flag=1;
break;
}
if(flag==0){
cha=i-a;
a=i;
if(cha==2) num++;
}
if(flag==1) flag=0;
}
cout<<num;
}
结果:
拜读了一下柳婼大神的代码,感觉她的代码清晰明了而且精简,是我要学习的代码!
#include <iostream>
using namespace std;
bool isprime(int a) {
for (int i = 2; i * i <= a; i++)
if (a % i == 0) return false;
return true;
}
int main() {
int N, cnt = 0;
cin >> N;
for (int i = 5; i <= N; i++)
if (isprime(i-2) && isprime(i)) cnt++;
cout << cnt;
return 0;
}
分析:
对于输⼊入数据N,for循环中的i从5到N依次判断:
i-2和i是否是素数,如果都是素数,则统计个数的cnt++,最后输出cnt。
后记:
当我尝试着使用柳神的思路提交我的code时,出了错误。我的代码再DevC++中可以正常运行,但是在系统上提交就显示答案错误,这令我十分困惑。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int isprime(int n){
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return 0; //是合数
return 1; //是质数
}
int main()
{
int n,num;
cin>>n;
for(int i=5;i<=n;i++)
if(isprime(i)&&isprime(i-2))
num++;
cout<<num;
}
后来我换了一个编译器提交,使用C++(clang+)成功将代码运行出来了。
注意:#include <cmath>使用 C++(g++) 提交会出错!!!