Written by Bruth_Lee in Southwest universiy of Science and Technology.
自测-2 素数对猜想(20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
/*#include<iostream>
using namespace std;
int prime_number(int x)//素数的判定,如果是素数返回该数,否则返回0
{
int mark = 1;
for (int i = 2; i < x; i++)
{
if (x%i == 0)
{
mark = 0;
break;
}
}
if(mark) return x;
else return 0;
}
int main()
{
int n, i,d, c = 0,a[100000];
while (cin >> n)
{
c = 0;
for (i = 1; i <=n; i++)
{
if (prime_number(i)) a[c++] = prime_number(i);//将素数装进数组a
}
n = c;
c = 0;
for (i = 0; i < n - 1; i++)
{
d = prime_number(a[i + 1]) - prime_number(a[i]);
if (d == 2) c++;
}
cout << c << endl;
}
return 0;
}*/
//此时提交会发现超时了。。原因在于判断一个素数的时候只需要在2~sqrt(n)之间循环,于是乎,我们必须对代码进行改进
#include<iostream>
#include<math.h>
using namespace std;
int prime_number(int x)//素数的判定,如果是素数返回该数,否则返回0
{
int mark = 1;
int y;
y = sqrt(x);
for (int i = 2; i <= y; i++)
{
if (x%i == 0)
{
mark = 0;
break;
}
}
if (mark) return x;
else return 0;
}
int main()
{
int n, i,d, c = 0,a,b;
while (cin >> n)
{
c = 0;
b = 3;
for (i = 3; i <=n; i++)
{
if(prime_number(i)) d = prime_number(i);
if (prime_number(i)) a = d;
//if (prime_number(i)) b= prime_number(i);
if (prime_number(i) && a-b==2) {
c++;
}
if (d) b = a;
}
cout << c << endl;
}
return 0;
}