筛法_算法进阶
来源:互联网 发布:c语言告白 编辑:程序博客网 时间:2024/05/18 20:07
描述:
用筛法求[a,b]中的素数。
Find out the prime numbers in [a, b].
输入:
2个正整数:a b。
a、b均在100000000以内,且a小于等于b,且b-a<250000。
2 positive integers: a, b. Both a and b are less than or equal 100000000 and a is less than or equal to b, and b - a < 250000.
输出:
[a b]区间内的所有素数,每个单独一行。
All primes in [a, b], each one in a row.
输入样例:
2 5
输出样例:
235
#include <iostream>
#include <math.h>
#include <math.h>
using namespace std;
int a, b;
int A[10000];
int p[2000]; //2到floor(sqrt(b))的素数
int T[250000]; //目标素数表
int cnt; //p[i] 的个数
int temp3; //floor(sqrt(b))
int a, b;
int A[10000];
int p[2000]; //2到floor(sqrt(b))的素数
int T[250000]; //目标素数表
int cnt; //p[i] 的个数
int temp3; //floor(sqrt(b))
void tableprime();
void init();
void aimprime();
int ss(int m);
void init();
void aimprime();
int ss(int m);
int main()
{
int n;
{
int n;
cin >> a;
cin >> b;
cin >> b;
init();
tableprime(); //生成2到floor(sqrt(b))的素数表
aimprime(); //生成目标素数表
//输出
for(n = a; n <= b; n ++)
{
if(n == 1)
continue;
else
{
if(T[n - a] == 1)
cout << n << endl;
}
}
return 0;
}
{
if(n == 1)
continue;
else
{
if(T[n - a] == 1)
cout << n << endl;
}
}
return 0;
}
void aimprime()
{
int i, j, k;
int temp2; //从 a + temp2 开始
for(i = 0; i < cnt; i ++)
{
if(a >= p[i])
{
if(a % p[i] == 0)
{
if(ss(a))
temp2 = p[i];
else
temp2 = 0;
}
else
temp2 = p[i] - a % p[i];
for(j = a + temp2; j <= b; j += p[i])
{
if(T[j - a] == 1)
{
T[j - a] = 0;
}
}
}
else
{
for(j = p[i] * 2; j <= b; j += p[i])
{
if(T[j - a] == 1)
{
T[j - a] = 0;
}
}
}
}
}
void tableprime()
{
int i, j ,k;
temp3 = floor(sqrt(b));
for(i = 2; i <= temp3; i ++)
{
if(A[i] == 1)
{
for(j = i + 1; j <= temp3; j ++)
{
if(j % i == 0)
A[j] = 0;
}
}
}
i = 0;
for(k = 2; k <= temp3; k ++)
{
if(A[k] == 1)
{
p[i] = k;
i ++;
}
}
cnt = i;
}
{
int i, j ,k;
temp3 = floor(sqrt(b));
for(i = 2; i <= temp3; i ++)
{
if(A[i] == 1)
{
for(j = i + 1; j <= temp3; j ++)
{
if(j % i == 0)
A[j] = 0;
}
}
}
i = 0;
for(k = 2; k <= temp3; k ++)
{
if(A[k] == 1)
{
p[i] = k;
i ++;
}
}
cnt = i;
}
void init()
{
int i;
temp3 = floor(sqrt(b));
for(i = 2; i <= temp3; i ++)
{
A[i] = 1;
}
for(i = a; i <= b; i ++)
{
T[i - a] = 1;
}
}
{
int i;
temp3 = floor(sqrt(b));
for(i = 2; i <= temp3; i ++)
{
A[i] = 1;
}
for(i = a; i <= b; i ++)
{
T[i - a] = 1;
}
}
int ss(int m)
{
int i;
for(i=2;i<=sqrt(m);i++)
{
if(!(m%i))
return 0;
}
return 1;
}
{
int i;
for(i=2;i<=sqrt(m);i++)
{
if(!(m%i))
return 0;
}
return 1;
}
算法:1,输入a和b
2,生成2到floor(sqrt(b))的素数表
3,再用2到floor(sqrt(b))的素数依次筛选a到b的元素
4 ,将a到b剩下的元素输出
其中aimprime()函数的实现(temp2关键),即筛选a到b中元素的初始点很关键
希望能对大家有所帮助!!!
阅读全文
0 0
- 筛法_算法进阶
- 算法进阶
- 进阶_回调Callback_150504
- 单链表_进阶版
- 夕拾算法进阶篇:18)装箱问题 (01背包_动态规划DP)
- 夕拾算法进阶篇:19)采药 (01背包_动态规划DP)
- 夕拾算法进阶篇:20)货币系统 (完全背包_动态规划DP)
- python进阶三_函数
- shiro(四)_进阶
- 进阶_线程(Handler)_150504
- 进阶_线程(HandlerThread)_150504
- 进阶_线程(AsyncTask)_150504
- 3.Python进阶_模块
- Python 进阶_模块 & 包
- C程序设计进阶_期末考试
- C#进阶3_集合
- C#进阶5_多态
- VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
- 一个项目:产品分类信息树状显示
- VirtualBox安装linux mint教程
- Ubuntu 17.10 32位兼容
- 201710192244->利用www类来下载图片
- 中断服务函数能不能带形参和返回值
- 筛法_算法进阶
- 【网络编程】UDP数据报格式
- css的那些事儿--background的多张背景的实现
- 软件工程之快速原型模型
- MacOS系统使用系列-2.Mac命令行提升效率工具thefuck
- C#的基本常识
- MVC框架
- opencv使用findcontours报错解决其他方案
- VSCode打开已有vuejs项目