素数对猜想题目:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
20
输入在一行给出正整数N。
输出格式:
4
在一行中输出不超过N的满足猜想的素数对的个数。
解题
部分完成:
#include <iostream>
using namespace std;
int saveAndSearchPrime(int*,int);
int findPrime(int);
int main()
{
int num;
int *arr=new int[num];
cin>>num;
cout<<saveAndSearchPrime(arr,num)<<flush;
return 0;
}
int saveAndSearchPrime(int* arr,int num)
{
int i,j;
for(i=2,j=0;;++i)
{
if(i>num) break;
else if(findPrime(i))
{
arr[j]=i;
++j;
}
}
int count=0;
for(i=1;i<j;++i)
if(arr[i]-arr[i-1]==2)
count++;
return count;
}
int findPrime(int num)
{
for(int i=2;i<=num/2;++i)
if(num%i==0) return 0;
return 1;
}
这是第一次尝试的解题,对oj接触不多的自己将代码复杂化了,以至于在最后用以测试点
输入测试数据100000时无法通过;
后来通过思考优化,将函数:
int saveAndSearchPrime(int* arr,int num)
中的外层循环直接舍去,大大降低了时间复杂度
相当于只需在判断i为素数时再次判断i-2亦为素数即可
并且也简短了代码长度:
全部实现:
#include <iostream>
using namespace std;
int saveAndSearchPrime(int*,int);
int findPrime(int);
int main()
{
int num;
int *arr=new int[num];
cin>>num;
cout<<saveAndSearchPrime(arr,num)<<flush;
return 0;
}
int saveAndSearchPrime(int* arr,int num)
{
int count=0;
for(int i=2;i<=num;++i)
if(findPrime(i))
if(findPrime(i-2))
count++;
return count;
}
int findPrime(int num)
{
if(num<=1) return 0;
for(int i=2;i*i<=num;++i)
if(num%i==0) return 0;
return 1;
}