PAT B1007 素数对猜想(满分20)

思路点拨:
第一步:先求出范围内的所有素数
第二步:判断相邻两个素数是否相差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++)

输出结果:
在这里插入图片描述

码后反思:
做题时,如果有时间要求,就需要考虑时间复杂度,必须想方设法降低时间复杂度。

猜你喜欢

转载自blog.csdn.net/qq_27538633/article/details/105921430
今日推荐