问题描述:
打印出2-N(10000)之间的素数
素数:只能被1和它本身整除,不能被其他数整除的大于1的自然数
普通方法:
1.首先输出一个2,然后从3开始,步长为2,只遍历奇数
2.判断一个数是否为素数时,只需要判断到大于其平方根时即可
#include <iostream>
using namespace std;
#define N 10000
int main(){
/*
* 求解2-N之间的素数(质数),假设N=10000;
* 采用普通方法
* 采用以空间换时间的 筛选法 求解
*/
//法one,两层循环(外层遍历,内存确认是否为素数)
//先输出一个2
cout<<2<<" ";
//偶数不可能是素数,只需要判断奇数即可?
for(int i=3;i<=N;i+=2)
{
//内层判断i是否为素数
//因为外层是奇数,所以内层不用判断偶数
int j;
for(j=3;j<i;j+=2)
{
if((i%j)==0)
{
//如果有因子,则说明i不是素数,退出循环
break;
}
//不可能是j*j==i,不然i就是合数了
if((j*j)>i)
{
//判断有无素数,判断到i的平方根即可
break;
}
}
//如果i为素数,那么上层循环语句的最后结果为j*j>=i
if((j*j)>i)
{
cout<<i<<" ";
}
}
return 0;
}
筛选法:
解题思路:
代码实现:
#include <iostream>
using namespace std;
#define N 10000
//数据元素是char类型,创建一个isprime
bool isprime[N+10];
int main(){
/*
* 求解2-N之间的素数(质数),假设N=10000;
* 采用普通方法
* 采用以空间换时间的 筛选法 求解
*/
//法two,筛选法
//将数组元素全部初始化为真
for(int i=2;i<=N;++i)
{
isprime[i]=true; //数组元素是一个字符串
}
//从1-N遍历所有的数字,依次将素数的倍数对应位置处的字符串置为false
for(int j=2;j<=N;++j)
{
//依次遍历判断
if(isprime[j])
{
//2是素数,然而2的倍数的所有的数都不是素数,将对应的数组元素置为false
for(int k=j*2;k<=N;k+=j)
{
isprime[k]=false;
}
}
}
//输出所有元素为true的数
for(int i=2;i<=N;++i)
{
if(isprime[i])
{
cout<<i<<" ";
}
}
return 0;
}
以上便是求解2-N之间素数的两种方法,感谢您的浏览!