样例解释:1013 数素数 (20分)

立志用更少的代码做更高效的表达


Pat乙级最优化代码+题解+分析汇总——>传送门


令 P​i表示第 i 个素数。现任给两个正整数 M≤N≤10^​4 ,请输出 P​M到 P​N的所有素数。

输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:
输出从 P​M到 P​N的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103


解题思路

本题的核心考点为:筛选法求某一区间的素数。

说明:筛选法可求某一数字区间的所有数字是否为素数, 且时间复杂度极低。

应用场景: 打表。 事先定义数组,利用筛选法,求得该数组所有数字下标是否为素数。 为接下来的判断操作做准备。

理解筛选法后,本题就很好做了,只需要输出相应区间即可

注意: 数组要开的大一些, 第四个样例规模非常大。


类型题——>1007 素数对猜想


代码实现

#include<bits/stdc++.h>
#define Max 1000005
using namespace std;
int vis[Max];
void Screen() {
	vis[0] = vis[1] = 1;
	for(int i = 2; i <= sqrt(Max); i++) 
		for(int j = i*2; j <= Max; j+= i) 
			vis[j] = 1;
		
}

int main() {
	Screen();
	int a, b; cin>>a>>b;
	int num = 0, num1 = 0;
	for(int i = 0; i < Max; i++) 
		if(vis[i] == 0) {
			++num;		//判断区间的 
			if(num>=a && num<=b) {
				 ++num1; 	//够10个就换行 
				if(num1 != 1) putchar(' ');
				cout << i; 
				if(num1==10 && num!=b) {
					num1 = 0; putchar('\n');
				} 
			} 
		}
	
return 0; }

每日一句

他日若遂凌云志,敢笑黄巢不丈夫。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页