令 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
结尾无空行
解题思路: 这是一道已经做过了的题,再刷一次看看有没有什么新的点子,发现对数据用合适的方式存储,能够在处理数据的时候少很多很多的事情。这道题目的点在于度求素数的熟练掌握,这次使用的是另外的一个求素数的方法,感觉还可以,加油加油.
彼方尚有荣光在!!!!!
//数素数,一个很普遍的问题
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
bool isPrime(int middle)
{
if(middle<=1)
return false;
int mide = (int)sqrt(middle*1.0);//使用sqrt也就是根号函数需要有math的头文件,并且sqrt()的参数必须是浮点数,而且返回值也是浮点数
for(int i = 2 ; i <= mide; ++i)//这里也有一种更加快的方法,可以使用平方的方法来做,而且因为这道题的特殊性也不会超出合理的范围,最大mide也就是100而已,所以可以使用那个
{
if(middle%i == 0)
return false;
}
return true;
}
int main()
{
int start = 0, end = 0;
vector<int>arr;
cin >> start >> end;
int number = 0;//number用来记录当前是第几个素数的
//使用计算起来更加方便的技巧
int i = 2;
while(number<end)//这里不能用等于
{
if(isPrime(i))//这里这样存储是为了在换行的时候更加的方便罢了
{
number++;
if(number>=start)
{
arr.push_back(i);
}
}
i++;
}//到这里就已经把满足题意的答案都统计完了
for(int i = 0 ; i < arr.size() ; ++i)
{
if(i!=0&&i%10==0)
cout <<endl;
if(i!=0&&i%10!=0)
cout <<" ";
cout << arr[i];
}
if(arr.size()%10!=0)
cout <<endl;
return 0;
}