素数快速求法
来源:互联网 发布:淘宝提高销量技巧 编辑:程序博客网 时间:2024/05/02 00:06
素数指的是只能被1和自身整除的的数。那么如何求解出N以内的所有素数呢?
1、暴力解决 遍历两次
2、优化暴力 内层遍历只需遍历到N的开方 因为一个合数能被整除a*b = N,那么a和b必然有一个是小于N的开方的。所以要是合数的话,遍历到N开方前就会被除开,证明为合数。
3、以上还是不够快,所以使用筛选法,即2的倍数,3的倍数.....都要不是素数,直接删除
1 #include <apue.h>
2
3 #define MAX 100
4
5 int main(int ac, char **av)
6 {
7 int flag[MAX];
8 int i = 0;
9 int j = 0;
10 int count = 0;
11
12 for(i = 0; i < MAX; i++){
13 flag[i] = 1;
14 }
15
16 for(i = 2; i * i <= MAX; i++){
17 if(flag[i]){
18 for(j = 2 * i; j < MAX; j++){
19 if(j % i == 0){
20 flag[j] = 0;
21 }
22 }
23 }
24 }
25
26 for(i = 2; i < MAX; i++){
27 if(flag[i]){
28 printf("%4d ",i);
29 count++;
30
31 if(count % 5 == 0)
32 printf("\n");
33 }
34 }
35 return 0;
36 }
/* 1.对于一亿的数据量,应该在堆中申请;
* 2.为了提高程序效率将cout改为printf;
* 3.判断是否是倍数时,应将求摩运算改为加法
*/
const int length = 100000000;
bool *flag = new bool[length];
for (int i = 2; i < length; i++) {
for (int j = i + i; j < length; j += i) {
flag[j]= 1;
}
}
for (int i = 2; i < length; i++) {
if (flag[i] == 0) {
printf("%d ", i);
}
}
printf("\n");
delete []flag;
还有很多其他比较好的方法,素数密度法,Miller-Rabin随机素数测试法等,不同方法有不同的应用场景,有兴趣的话,可以在网上查查。
- 素数快速求法
- 素数快速求法 -- 筛法求素数
- 素数求法
- 素数求法
- 素数求法/
- 素数的求法
- 孪生素数的求法
- 素数的求法
- 素数的求法
- 转~素数求法
- 素数的求法
- 三种素数求法
- 素数的求法
- 素数的优化求法
- 素数的几种求法
- 大范围内素数的求法
- C++实现素数的求法
- 最大公约数的快速求法
- aop
- FFmpeg解析视频里面的音频aac保存
- BIT2014级软件学院程序设计-07 Crossing River
- 怎样计算C++继承、虚继承、虚函数类的大小
- NodeJS 复制大文件防治包内存的解决办法
- 素数快速求法
- UIViewController的完整生命周期
- JFinal学习--02Constants
- proxool 详细配置
- 加解密方法
- mkenvimage
- js 搜索关键字,文章中关键字高亮显示
- android studio添加和引入Libary的一些问题小结
- Matlab的曲线拟合工具箱CFtool使用简介及一种非线性函数的曲线拟合方法(函数公式: k = A*(T^a)*exp(E/T) )