~筛选法求素数~欧耶\(^o^)/...
来源:互联网 发布:二手别墅知乎 编辑:程序博客网 时间:2024/05/23 19:13
/*-----------筛选法求1-n内的素数的个数,并输出,n最大1000000---------*/
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
bool a[1000000+1];
int i,n,j,k,num;
while(cin >> n)
{
clock_t start_time=clock(); //起始时间计算
num=0;
for(i=1;i<n+1;i++)
{
a[i]=true; //先标记所有的数都是true
}
a[1]=false; //判断1不是素数,为false
a[2]=true; //判断2是素数,为true
for(k=2;k<=n;k++)
{
for(j=2;j*k<=n;j++)//从2开始,2的倍数,3的倍数,4的倍数...都不是素数,为false
{
a[j*k]=false;
}
}
for(i=3;i<=n;i++)
{
if(a[i]==true)
{
for(j=2;j<=sqrt(i);j++) //从3开始,把那些还是true的,再进行判断,if(i%j==0)的,即不是素数,为false
{
if(i%j==0)
a[i]=false;
}
}
}
for(i=1;i<=n;i++)
{
if(a[i]==true)
{
num++;
cout << i; //最后通过小标认为true的即为素数,输出并算出个数
if(i!=n)
cout << " ";
}
}
clock_t end_time=clock(); //末尾时间计算
cout << endl;
cout << num << endl;
cout << "Total time used:" << static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC << "second" << endl; //输出起始末尾间的运行时间
}
return 0;
}
筛选法主要就是这个思想,排除法,先直接排除i的倍数,所有的派出完了,再来将剩下的进行判断,重要的就是定义布尔数组,作为标记。。。这样就可以减少运行时间,可以判断大量的数据而不怕超过运行时间。
结尾有计算程序运行时间,可以发现这种筛选法比普通的要快的多。。。特别是处理大量的数字。
- ~筛选法求素数~欧耶\(^o^)/...
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数/
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- eclipse配置c++环境
- 关于leveldb
- win(7)未在本地计算机上注册“MSDAORA.1”提供程序
- Linux Shell脚本编程--curl命令详解
- JAVA多线程之BlockingQueue
- ~筛选法求素数~欧耶\(^o^)/...
- 用定时器T0的中断控制8位LED闪烁
- ArrayList和LinkedList实现
- 【js学习笔记-008】--数字.算术运算
- notes客户端表单通过代理保存的问题
- D3学习一
- hdu 1520-树形DP
- linux 条件变量
- cygwin下安装软件