心得:
在做有范围限制的题时,要时刻注意是否越界
vector.end()返回的迭代器是指向vector最后一个元素的下一个位置的
题目:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
思路:
有两种思路,但其实大同小异
1:声明一个vector容器,将所有小于等于N的素数装进去,然后逐个判断相邻的元素差值是不是2,是2的话就把素数对个数加1
2:从2到N找素数,找到一个素数后然后再继续找其下一个素数(就是素数中其相邻的),然后判断差值是不是2,是2总数加1,不是就继续往下找
代码:
1:
#include<iostream>
#include<math.h>
using namespace std;
bool isPrime(int num);
int main()
{
int num,sum=0;
cin>>num;
for(int i=2;i<num;i++)
{
if(isPrime(i))
{
int next=i+1;//某数的下一个数
while(!isPrime(next))//如果next是素数,就去判断,不然就继续向下找,直到找到素数为止
{
next++;
}
if((next - i)==2&&next<=num)//这里还要判断next是否已经越界了
sum++;
}
}
cout<<sum<<endl;
return 0;
}
bool isPrime(int num)
{
for(int i=2;i<=sqrt(num);i++)
{
if(num%i==0)
return false;
}
return true;
}
2:
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
bool isPrime(int num);
int main()
{
int num,sum=0;
vector<int> prime;
cin>>num;
for(int i=0;i<=num;i++)
{
if(isPrime(i))
prime.push_back(i);//将num以内的素数装进容器
}
for(vector<int>::iterator it=prime.begin();it!=prime.end()-1;it++)//it指到end()-2就行,不然下面it+1会越界
{
if((*(it+1)-*it)==2)
sum++;
}
cout<<sum;
return 0;
}
bool isPrime(int num)
{
if(num<=1)
return false;
for(int i=2;i<=sqrt(num);i++)
{
if(num%i==0)
return false;
}
return true;
}
2的运行效率稍微高一点点,毕竟只要一个for循环。。。