让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10^5 ),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
解析:
1.如何得到素数
> 对依次所得数字进行判断
> bool isnum(int n)
> {
> if(n==1) return false;
> if(n==2) return true;
> for(int i=2;i<n;i++)
> {
> if(n%i==0) return true;
> }
> return false;}
方法一:正常运行但未能通过第五个测点(超时)
#include<iostream>
using namespace std;
int isnum(int n)
{
for(int i=2;i<n;i++)
{
if(n%i==0)return true;
}
return false;
}
int main()
{
int n;
cin>>n;
int d,p0,p1,count;
p0=2;
p1=3;
count=0;
for(int i=4;i<=n;i++) {
if(isnum(i)==false){
p0=p1;
p1=i;
if(p1-p0==2)
{ count++;}} }
cout<<count;
}
改进:
1.大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等。反之不成立,例如25 49
2.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数;并且大于2的偶数都不是素数
answer:
#include<iostream>
#include<math.h>
using namespace std;
int isnum(int n)
{
int k=sqrt(n);
for(int i=2;i<=k;i++)//等号别少!!!
{
if(n%i==0)return true;
}
return false;
}
int main()
{
int n;
cin>>n;
int d,count;
if(n>=5)
count=1;
else count=0;
for(int i=6;i<=n-1;i=i+6)
{
if(isnum(i+1)==false&&isnum(i-1)==false)
{
count++;
}
}
cout<<count;
}
结果biu!