关于素数总结:
2010-08-09 11:35
274 查看
http://hi.baidu.com/ve_bird/blog/item/a4a240c845eac54af21fe7e6.html
定义:除了1和其本身,没有其他约数的数。
测试:用n分别试除2到sqrt(n)的数,如果中间有一个能整除,即
为合数,否则即为素数
bool is_prime(int n)//判断n是否为素数,是素数返回1
{
int i;
bool flag = 1;
for(i = 2; i <= sqrt(n); i++)
{
if(n % i == 0){
flag = 0;
break;
}
}
return flag;
}
小范围内筛素数(数据不太大):
#define Max 1000
int Prime[500];
int q;
void get_prime()
{
q = -1;
Prime[++q] = 2;
Prime[1] = 3;
int i;
for(i = 5; i <= Max; i++){
for(j = 0;Prime[j]*Prime[j] <= i &&i%Prime[j] != 0; j++);
if(Prime[j]*Prime[j] > i)Prime[++q] = i;
}
}
大范围内筛素数的普通筛法(很慢):
#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
q = -1;
int i,j;
for(i = 2; i*i < Max; i++){
if(IsPrime[i] == 1){
for(j = i+i; j < Max; j += i){
IsPrime[j] = 0;
}
}
}
for(i = 2; i < Max; i++){
if(IsPrime[i] == 1)
Prime[++q] = i;
}
}
大范围内素数的线性筛法(比普通筛法更快)
#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
q = -1;
int i,j;
for(i = 2; i < Max; i++){
if(IsPrime[i] == 1)
Prime[++q] = i;
for(j = 0;j <= q && Prime[j] * i < Max; j++){
IsPrime[Prime[j] * i] = 0;
if(i % Prime[j] == 0)break;
}
}
}
求某一区间(a,b)内的素数
有时候我们碰到的问题是要求求出a b间的素数,而a又比较大,
这种情况下就可以用这种方法实现(a>2)
注意:要先通过以上几种方法求出2到sqrt(a的最大取值)范围内
的素数存入Prime[].
int prime[500000];
bool isprime[1000000];
int qt;
void get_prime1(int a,int b)
{
int i,j,k;
for(i = 0; i <= b - a; i++)
isprime[i] = 1;
for(i = 0; Prime[i]*Prime[i] <= b && i <= q;i++){
k = a/Prime[i];
if (k*Prime[i] < a) k++;
if (k <= 1) k++;
while(k*Prime[i] <= b){
isprime[k*Prime[i] - a] = 0;
k++;
}
}
qt = -1;
for(i = 0; i <= b - a; i++)
{
if(isprime[i] == 1)
prime[++qt] = i + a;
}
}
定义:除了1和其本身,没有其他约数的数。
测试:用n分别试除2到sqrt(n)的数,如果中间有一个能整除,即
为合数,否则即为素数
bool is_prime(int n)//判断n是否为素数,是素数返回1
{
int i;
bool flag = 1;
for(i = 2; i <= sqrt(n); i++)
{
if(n % i == 0){
flag = 0;
break;
}
}
return flag;
}
小范围内筛素数(数据不太大):
#define Max 1000
int Prime[500];
int q;
void get_prime()
{
q = -1;
Prime[++q] = 2;
Prime[1] = 3;
int i;
for(i = 5; i <= Max; i++){
for(j = 0;Prime[j]*Prime[j] <= i &&i%Prime[j] != 0; j++);
if(Prime[j]*Prime[j] > i)Prime[++q] = i;
}
}
大范围内筛素数的普通筛法(很慢):
#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
q = -1;
int i,j;
for(i = 2; i*i < Max; i++){
if(IsPrime[i] == 1){
for(j = i+i; j < Max; j += i){
IsPrime[j] = 0;
}
}
}
for(i = 2; i < Max; i++){
if(IsPrime[i] == 1)
Prime[++q] = i;
}
}
大范围内素数的线性筛法(比普通筛法更快)
#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
q = -1;
int i,j;
for(i = 2; i < Max; i++){
if(IsPrime[i] == 1)
Prime[++q] = i;
for(j = 0;j <= q && Prime[j] * i < Max; j++){
IsPrime[Prime[j] * i] = 0;
if(i % Prime[j] == 0)break;
}
}
}
求某一区间(a,b)内的素数
有时候我们碰到的问题是要求求出a b间的素数,而a又比较大,
这种情况下就可以用这种方法实现(a>2)
注意:要先通过以上几种方法求出2到sqrt(a的最大取值)范围内
的素数存入Prime[].
int prime[500000];
bool isprime[1000000];
int qt;
void get_prime1(int a,int b)
{
int i,j,k;
for(i = 0; i <= b - a; i++)
isprime[i] = 1;
for(i = 0; Prime[i]*Prime[i] <= b && i <= q;i++){
k = a/Prime[i];
if (k*Prime[i] < a) k++;
if (k <= 1) k++;
while(k*Prime[i] <= b){
isprime[k*Prime[i] - a] = 0;
k++;
}
}
qt = -1;
for(i = 0; i <= b - a; i++)
{
if(isprime[i] == 1)
prime[++qt] = i + a;
}
}
相关文章推荐
- 关于素数问题总结
- 关于变量的各种运算自增(自减)总结:
- 关于变量问题的总结
- 总结:关于console的一些用法
- 关于内存对齐的总结
- 关于javah编译.h头文件时出现的问题总结
- 关于Remoting服务启动和停止的简单总结 (转)
- 关于性能优化自己总结的几点内容
- 一周以来工作总结--关于位图索引
- 关于TCPIP的三次握手和四次挥手的总结
- 关于Java web开发中文乱码问题的总结
- 关于Java的泛型在所声明的对象中如何获取class或者实例的方法的总结
- 关于Android 中View的分发机制的学习与总结(ViewGroup篇)
- 关于 Web Service 的一些总结,一些理解
- 关于ios导航控制器的知识总结
- 关于ACM兴趣小组安卓方向学习总结
- 关于自我总结的html5新特性
- 【数学】关于素数的检验
- 关于activity的使用规范小总结
- 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”