1013数素数
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出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
C语言版:
#include<stdio.h>
#include<math.h>
int scnprim(int n);
int main()
{
int i,m,n,count=0;
scanf("%d %d",&m,&n);
for(i=2;;i++)
{
if(scnprim(i))
{
count++;
if(m<=count&&n>=count)
{ if((count-m+1)%10==0)
printf("%d\n",i);
else if(count!=n)
printf("%d ",i);
else
printf("%d",i);
}
}
if(n<count)
{
break;
}
}
return 0;
}
int scnprim(int n)//筛选素数
{
int sqrtc,j;
sqrtc=(int)sqrt(n);
for(j=2;j<=sqrtc;j++)
{
if(n%j==0)
return 0;
}
return n;
}
C++版本
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
bool isPrimer(int n){
for(int i=2;i<(int)sqrt(n)+1;i++){
if(n%i == 0){
return false;
}
}
return true;
}
int main(){
vector<int>vec;
for(int i =2;i < 110000;i++){
if(isPrimer(i)){
vec.push_back(i);
}
}
for(int n,m;cin>>n>>m;){
int count = 0;
for(int i = n-1;i<m;i++){
count++;
cout<<vec[i];
if(i+1 == m){
cout<<endl;
}else{
if(count == 10){
cout<<endl;
count = 0;
}else{
cout<<" ";
}
}
}
}
return 0;
}
C++second version
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define NUM 10004
int primes[NUM];
void findPrimes(){
//如果不能被任何一个质数整除,那就是质数
int cnt=0;// 第cnt个质数,从1开始计数
int a = 2;// 从2开始的自然数 a
while (cnt <= NUM) {
// 优化1:排除偶数
if (a % 2 == 0 && a != 2) {
++a;
continue;
}
int i = 0;
// 优化2:不超过第cnt个质数的开方数
for (i = 0; i < sqrt(cnt); ++i) {
if (a % primes[i] == 0) {
break;
}
}
if (i >= sqrt(cnt)) {
primes[cnt] = a;
cnt++;
}
++a;
}
}
int main(){
// 预处理
findPrimes();
// 输入数据
int m,n;
cin >> m >> n;
// 按格式输出
for(int i = m; i <= n; ++i){
cout << primes[i-1];
if ((i-m+1) % 10 == 0 || i == n) {
// cout << endl;
printf("\n");
}else{
// cout << ' ';
printf(" ");
}
}
}
C++Third version
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n=1,M,N,i=0;
int count=0,num=0;
cin>>M>>N;
while(++n)
{
for(i=2;i<=int(sqrt(n*0.1*10.0));i++)
{
if(n%i==0)
break;
}
i=i-1;//注意for循环后面的i++,因此此处要减一
if(i==int(sqrt(n*0.1*10.0)))
{
count++;
if(count>=M&&count<=N)
{
num=num+1;
cout<<n;
if(num<10&&count!=N)
cout<<' ';
else
{
num=0;
cout<<endl;
}
}
}
if(count>N)
break;
}
}