思路点拨:
第一步:先求出范围内的所有素数
第二步:判断相邻两个素数是否相差2,若相差2,则计数加1。
暴力求解:
下面做法是没有经过优化的暴力求解范围内所有素数,就是时间复杂度不满足要求,不能得满分,会出现超时。
#include<iostream>
using namespace std;
int main()
{
int N;
cin >> N;
int num[100000]; // 存储所有的
int m = 0;
for (int i = 2; i < N + 1; i++)
{
string s = "YES";
for (int j = 2; j < i; j++)
{
if (i%j == 0)
{
s = "NO";
break;
}
}
if (s == "NO") ;
else num[m++] = i;
}
int count = 0;
for (int i = 1; i < m; i++)
{
if (num[i] - num[i - 1] == 2) count++;
}
cout << count;
system("pause");
return 0;
}
运行结果:
经过优化:
就是,求解素数时,考虑的范围是2到根号i,这样,时间复杂度就降下来了,就可以满分AC。
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int N;
cin >> N;
int num[100000]; // 存储所有的
int m = 0;
for (int i = 2; i < N + 1; i++)
{
string s = "YES";
for (int j = 2; j < sqrt(i)+1; j++)
{
if (i%j == 0)
{
s = "NO";
break;
}
}
if (s == "NO") ;
else num[m++] = i;
}
int count = 0;
for (int i = 1; i < m; i++)
{
if (num[i] - num[i - 1] == 2) count++;
}
cout << count;
system("pause");
return 0;
}
优化的具体地方:
for (int j = 2; j < sqrt(i)+1; j++)
输出结果:
码后反思:
做题时,如果有时间要求,就需要考虑时间复杂度,必须想方设法降低时间复杂度。