原题:
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
0.显而易见,此题可以转换为“求n以内素数”的问题
1.枚举法求素数:对于求n以内素数的题目,估计有一些人会使用枚举法,像这样:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
//求n以内的所有素数
for (int i = 2; i <= n; i++)
{
for (j = 2; j <= i/2; j++)
{
if (i%j == 0)
break;
}
if (j-1 == i/2)
cout<<i<<” “;
}
return 0;
}
但是,要注意两个限制:
1.n是个大数,小于10e5;
2.程序对时间有限制200ms;
所以,使用上述枚举法,就会导致程序超时,无法计算。
那我们就需要用一种新的计算n以内素数的方法:筛法求素数
2.筛法求素数:
#include<iostream>
using namespace std;
int n;
char isPrime[100000]; //用char类型节省内存,int占4字节,char占1字节,效果都一样,因为这里用1,0代表素数与否
int main()
{
cin>>n;
for(int i = 2; i <= n; ++i) //先将所有元素都认为是素数
isPrime[i]=1;
for(int i = 2; i <= n; ++i)
{
if(isPrime[i])//只用标记素数的倍数
for(int j = i * 2; j <= n; j += i)
isPrime[j] = 0; //将其标记为非素数
}
for(int i = 2; i <= n; ++i) //依次输出素数
{
if(isPrime[i])
cout<<i<<" ";
}
return 0;
}
先将所有元素默认为素数,再依次筛除掉合数,这样大大减少了程序运行的时间。
可以用筛法求素数求解此题。
3.1007源代码:
#include<iostream>
#include<cmath>
using namespace std;
int n;
int q = 0;
int a[2] = { 1 };
char isPrime[100000];//用char类型节省内存,int占4字节,char占1字节,效果都一样,因为这里用1,0代表素数与否
int main()
{
cin >> n;
for (int i = 2; i <= n; ++i)//先将所有元素都认为是素数
isPrime[i] = 1;
for (int i = 2; i <= n; ++i)
{
if (isPrime[i])//只用标记素数的倍数
for (int j = i * 2; j <= n; j += i)
isPrime[j] = 0; //将其标记为非素数
}
for (int i = 2; i <= n; ++i)//依次输出素数
{
if (isPrime[i])
{
if (a[0] <= a[1])
a[0] = i;
else
a[1] = i;
if (fabs(a[0] - a[1]) == 2)
q++;
}
}
cout << q;
return 0;
}
4.两种算法的分析比较:
枚举法求n以内素数,内存小,时间长;
筛法求素数内存大,时间短。