PAT Basic 1013 数素数 (20) [数学问题-素数]

题目

令Pi表示第i个素数。现任给两个正整数M <= N <= 10^4,请输出PM到PN的所有素数。
输⼊格式:
输⼊在⼀⾏中给出M和N,其间以空格分隔。
输出格式:
输出从PM到PN的所有素数,每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

题目分析

打印从第m个质数到第n个质数之间所有质数,每10个一行

解题思路

  1. 建立质数表
  2. 打印从第m个质数到第n个质数之间所有质数

Code

Code 01

#include <iostream>
#include <cmath>
using namespace std;
int m,n; 
bool isPrime(int v) {
	if(v<=1)return false;
	int sqr=(int)sqrt(1.0*v);
	for(int i=2; i<=sqr; i++) {
		if(v%i==0)return false;
	}
	return true;
}
int prime_table[1000010];
bool prime_bool[1000010];//1000010测试点4错误 
void create_pt() {
	int index = 1;
	for(int i=2; i<1000010; i++) {
		if(prime_bool[i]==false) {
			prime_table[index++]=i;
			for(int j=i+i; j<1000010; j+=i) {
				prime_bool[j]=true;
			}
		}
		if(index>n)break; //节省时间,最大为n,n后面不需要找了, 
	}
}
int main(int argc,char *argv[]) {
	scanf("%d %d",&m,&n);
	create_pt();
	for(int i=1; m+i-1<=n; i++) {
		if(i%10!=1)printf(" ");
		printf("%d",prime_table[m+i-1]);
		if(i%10==0)printf("
");
	}
	return 0;
}

Code 02

#include <iostream>
#include <vector>
using namespace std;
bool isprime(int a) {
	for (int i = 2; i * i <= a; i++)
		if(a % i == 0) return false;
	return true;
}
int main() {
	int M, N, num = 2, cnt = 0;
	cin >> M >> N;
	vector<int> v;
	while (cnt < N) {
		if (isprime(num)) {
			cnt++;
			if (cnt >= M) v.push_back(num);
		}
		num++;
	}
	cnt = 0;
	for (int i = 0; i < v.size(); i++) {
		cnt++;
		if (cnt % 10 != 1) printf(" ");
		printf("%d", v[i]);
		if (cnt % 10 == 0) printf("
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/houzm/p/12267212.html