1013 数素数 (20分)_Quentin

题目链接:1013 数素数(20分)
令 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

题目分析:我一开始想国去找素数的通项公式,那这个题不就简单了,还是我年轻了,这个东西没有通项公式的,只有一些“公式”适用于一定的区间内.那怎么办呢?
难道要把从1开始一直到10000中间所有的素数挨个算出来?第一总感觉这样计算比较笨,第二你确定第10000个素数就在[1,10000]这个区间里吗?(笨方法可以做,你只需要百度出来第10000个素数就可以了,第10000个素数是104729)
我们想要一个比较聪明的做法,那该怎么做呢?暂时还没想出来。。。。如果网友有比较好的方法可以评论给我~

题目代码:

#include <iostream>
using namespace std;
bool isprime(int n){//验证是否为素数的自定义函数 
	for(int i=2; i*i<=n; i++)
		if(n%i == 0)
			return false;
	return true;
}
int main(){
	int M, N;
	int prime[10001];//存那一大堆素数的数组 
	scanf("%d %d", &M, &N);
	for(int i=1, j=1; i<=104729; i++)//逐个搜查 
		if(isprime(i)){
			prime[j] = i;//逐个加入素数数组 
			j++;
		}
	for(int i=M+1, j=1; i<=N+1; i++, j++){//逐个输出 
		printf("%d",prime[i]);
		if(j%10 == 0 && j!=0)//控制换行 
			printf("\n");
		else if(i != N+1)//控制空格 
			printf(" ");
	}
	return 0;
}

bilibili:羊卓的杨

猜你喜欢

转载自blog.csdn.net/qq_45800977/article/details/106307908