数素数 (20)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
令Pi表示第i(i从1开始计数)个素数。现任给两个正整数M <= N <= 10000,请输出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 <vector>
using namespace std;
bool isSushu(int val)//判断是否为素数
{
for(int i=2;i*i<=val;i++)//开根号法,这里偷了个懒,把i平方省略加头文件了
{
if(val%i==0)return false;
}
return true;
}
判断是否为素数有两种方法,这里运用了开根号法:
(原因:素数是因子为1和本身, 如果数c不是素数,则还有其他因子,其中的因子,假如为a,b.其中必有一个大于sqrt(c) ,一个小于sqrt(c) 。所以m必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即一个合数一定含有小于它平方根的质因子。)
int main()
{
int N,M;
cin>>M>>N;
vector<int>v(N);//vector可以存放任意类型的动态数组
int num=2,count=0;
int flag=0;
while(count<N)//将前N个素数存入数组中
{
if(isSushu(num))
{
v[count]=num;
count++;
}
num++;
}
for(int i=M-1;i<N;i++)//按照题目格式输出第M~N个素数
{
if(flag)cout<<" ";
cout<<v[i];
flag++;
if(flag==10)
{
cout<<endl;
flag=0;
}
}
}