C++实现PAT乙级1007: 素数对猜想
题目描述:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N
(<10^5),请计算不超过N
的满足猜想的素数对的个数。
- 时间限制: 200 ms
- 内存限制: 64 MB
- 代码长度限制: 16 KB
思路 :
找到2到N之间所有的素数,将其保存在数组中。然后计算arr[i+1]-arr[i],若其值为2,则说明其满足素数对猜想,素数对计数器+1。直到遍历完所有的数组元素。
代码:
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int N)
{
int i=2;
while(i<=sqrt(N))//注意使用sqrt(而不是N/2)
{
if(N%i==0)
{
return false;
}
i++;
}
return true;
}
int main()
{
int N;
cin>>N;
int arr[N];
int k=0;
int count=0;
for(int i=2;i<=N;i++)
{
if(isPrime(i))
{
arr[k++]=i;
}
}
for(int i=0;i<k-1;i++)
{
if(arr[i+1]-arr[i]==2)
{
count++;
}
}
cout<<count;
return 0;
}
注意点:题目中的N的范围为10的5次方,数据比较大,因此得注意判断某个数是否为素数得算法就得注意。在循环条件必须是sqrt(N),否则最后一个测试几点会超时。