素数判断和素数筛法
2016-01-29 17:03
260 查看
素数的判断:
bool isPrime(long long n)
{
int lim = floor( sqrt(n * 1.0 + 0.5) );
for (int i = 2; i <= lim; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
素数筛法:
const int MAXV = 100; //素数表范围
bool flag[MAXV+1]; //标志一个数是否为素数
int prime[MAXV+1]; //素数表,下标从0开始
int size=0; //素数个数
void genPrime(int max)
{
memset(flag, true, sizeof(flag));//首先对标签数组进行初始化,全部设为true。
for(int i = 2; i <= max / 2; i++)
{
/*
从2开始,删除2的倍数
*/
if(flag[i])
{
//j=i<<1等价于 j=i*2,即j是i的两倍,而最后的j+=i,则表示下一个循环j是i的3倍,接着4倍。。。
//i的所有2~N倍数肯定都不是素数,因此将flag置为0,直到最后一位。
for(int j = i << 1 ; j <= max; j += i)
{
flag[j] = false;
}
}
}
for(int i = 2 ; i <= max; i++)
{
if(flag[i])
{
prime[size++] = i;//存储素数。将所有标志位依然为1的标志写入素数数组中去。
}
}
}
bool isPrime(long long n)
{
int lim = floor( sqrt(n * 1.0 + 0.5) );
for (int i = 2; i <= lim; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
素数筛法:
const int MAXV = 100; //素数表范围
bool flag[MAXV+1]; //标志一个数是否为素数
int prime[MAXV+1]; //素数表,下标从0开始
int size=0; //素数个数
void genPrime(int max)
{
memset(flag, true, sizeof(flag));//首先对标签数组进行初始化,全部设为true。
for(int i = 2; i <= max / 2; i++)
{
/*
从2开始,删除2的倍数
*/
if(flag[i])
{
//j=i<<1等价于 j=i*2,即j是i的两倍,而最后的j+=i,则表示下一个循环j是i的3倍,接着4倍。。。
//i的所有2~N倍数肯定都不是素数,因此将flag置为0,直到最后一位。
for(int j = i << 1 ; j <= max; j += i)
{
flag[j] = false;
}
}
}
for(int i = 2 ; i <= max; i++)
{
if(flag[i])
{
prime[size++] = i;//存储素数。将所有标志位依然为1的标志写入素数数组中去。
}
}
}
相关文章推荐
- xcode编包时code sign报错:User interaction is not allowed
- 浅谈CRM系统之客户数据分析
- 使用七牛云存储解决ios7.1的app部署问题
- Garbage Heap
- CocoaPosd详解
- thinkPHP的字母函数
- 使用转场动画构造侧滑
- shell编程-变量
- 最小的k个数
- oracle 11.2.0.3 设置启动脚本使ORACLE自动启动
- JavaScript 数据类型
- vi/vim基本使用方法
- Java 冒泡排序
- sql 自关联 优化
- UICollectionView基础
- android模拟器Unexpected value from nativeGetEnabledTags: 0 问题解决方法
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理
- board_key.h/board_key.c
- moverzp的博客目录
- hdu 1576(拓展欧几里得)