素数指的是因子仅仅有1和本身的数(1不是素数),求解素数在数学上应用很广泛,而求解n以内的素数也是我们编程时常遇到的问题,在这个问题上,筛选法求解素数执行得很快。以下首先介绍怎样推断一个是不是素数,然后介绍用普通方法求n以内的素数,接着是筛选法求n以内的素数,最后是两种算法的执行时间比較

推断一个数是不是素数

算法思想:推断小于等于一个数的平方的全部大于1的整数是不是能整除这个数,假设能,则表明这个数不是素数;反之,则是素数。

//推断一个数是否为素数
bool isPlain(int value){int m = sqrt(value);if (value < 2) return false;for (int i = 2; i <= m; i++){if ((value%i)==0){return false;}}return true;
}

普通方法求解n以内的素数

算法思想:声明一个n大小的bool数组。初始值为false,然后从2開始推断一个数是否为素数。若是。则将其的布尔值定为true

//普通法求素数
bool* putong(int n){bool* value = new bool[n];for (int i = 0; i < n; i++)value[i] = false;for (int i = 2; i < n; i++){if (isPlain(i)){value[i] = true;}}return value;
}

筛选法求n以内的素数

算法思想:找出小于等于n的开方的素数。然后将n内全部这些素数的倍数统统去掉,剩下的数就都是素数,也是通过布尔数组实现

//筛选法求素数
bool* shuaixuan(int n){bool* value = new bool[n];for (int i = 0; i<n; i++)value[i] = true;value[0] = false;value[1] = false;for (int i = 2; i <= sqrt(n); i++){if (value[i] && isPlain(i)){int c = 2;int j = i*c;while (j < n){value[j] = false;j = i*c++;}}}return value;
}

完整代码及执行结果

下述代码分别调用了普通方法和筛选法,可循环输入n(按Ctrl + C结束),以供不同数据的測试,后面附了一张执行測试的结果图

#include <iostream>
using namespace std;
#include <ctime>
#include <math.h>
#include <conio.h>
//推断一个数是否为素数
bool isPlain(int value){int m = sqrt(value);if (value < 2) return false;for (int i = 2; i <= m; i++){if ((value%i)==0){return false;}}return true;
}//普通法求素数
bool* putong(int n){bool* value = new bool[n];for (int i = 0; i < n; i++)value[i] = false;for (int i = 2; i < n; i++){if (isPlain(i)){value[i] = true;}}return value;
}//筛选法求素数
bool* shuaixuan(int n){bool* value = new bool[n];for (int i = 0; i<n; i++)value[i] = true;value[0] = false;value[1] = false;for (int i = 2; i <= sqrt(n); i++){if (value[i] && isPlain(i)){int c = 2;int j = i*c;while (j < n){value[j] = false;j = i*c++;}}}return value;
}int main(){int n;while (cin >> n){int start = clock();bool* value1 = putong(n);int end = clock();cout << "普通方法:" << end - start << endl;start = clock();bool* value2 = shuaixuan(n);end = clock();cout << "筛选法:" << end - start << endl;delete[] value1;value1 = NULL;delete[] value2;value2 = NULL;}_getch();
}


从图中可看出,n越大。筛选法对普通方法的性能就越好。

转载于:https://www.cnblogs.com/gcczhongduan/p/5371520.html

【算法】普通方法和筛选法求素数相关推荐

  1. 经典算法——筛选法求素数(素数筛选)

    [数值问题]素数筛选 内存限制:128 MB时间限制:1.000 S 题目描述 输入一正整数n(2<=n<=5*10^6),按顺序输出2到n范围内的所有素数. 输入 输入共一行一个数,表示 ...

  2. 筛选法求素数一般方法求素数判断一个数是否是素数

                                      筛选法求素数&一般方法求素数&判断一个数是否是素数 1.判断一个数是否是素数 #include<stdio.h ...

  3. 问题 F: 筛选法求素数

    时间限制: 1 Sec  内存限制: 0 MB 题目描述 筛选法求素数是一种高效求素数的方法,其具体算法如下: 从2开始把连续的整数放入筛中,首先确定筛中第一个数2是素数.并从筛中晒去所有2的倍数(不 ...

  4. Eratosthenes集合筛选法求素数

    Eratosthenes集合筛选法求素数 算法思想 和数因子,和数因子是从素数中产生的,最小的素数为2,m作为合数因子,从2开始,配合k+=m,删除合数因子的倍数,当m不断扩大时,如当m为5的时候,上 ...

  5. python使用集合实现筛选法求素数-python素数筛选法浅析

    原理: 素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.在加密应用中起重要的位置,比如广为人知的RSA算法中,就是基于大整数的因式分解难题,寻找两个超大的素数然后相乘作 ...

  6. 经典中的经典之——筛选法求素数(埃氏筛 | 线性筛)

    题目描述 统计小于非负整数n的质数数量 浑水摸鱼之蛮力验证法 直接上代码 bool is_zen(int x) {int i = 2;while (i * i <= x) {if (x % i ...

  7. python筛选法求素数讲解_埃氏筛选法求素数 Python

    代码如下 def _odd_iter(): # 构建奇数序列 从3开始 n = 1 while True: n = n + 2 yield n def _not_divisible(n): retur ...

  8. 素数筛(筛选法求素数)

    求素数 Problem Description 求小于n的所有素数的数量.(素数筛概念) Input 多组输入,输入整数n(n<1000000),以0结束. Output 输出n以内所有素数的个 ...

  9. python筛选质数并一行输出五个_python使用filter方法递归筛选法求N以内的质数素数附一行打印心形标记的代码解析...

    本人在学习使用Python的lambda语法的过程中,用之前求解质数的思路重写了一遍,思路如下:就是新建一个长数组,然后从前往后递归相除去过滤后面的元素.中间对于Python语法的有了一点新的认识:看 ...

  10. python实现素数筛选法_python 使用 filter 方法递归筛选法求 N 以内的质数 (素数)

    本人在学习使用 Python 的 lambda 语法的过程中,用之前求解质数的思路重写了一遍,思路如下:就是新建一个长数组,然后从前往后递归相除去过滤后面的元素.中间对于 Python 语法的有了一点 ...

最新文章

  1. 陆奇演讲:人工智能精要
  2. Android应用开发:网络编程-1
  3. Apache + PHP 服务
  4. Android设计模式之——单例模式
  5. 推荐 | 微软SAR近邻协同过滤算法相关问题(三)
  6. 华为摄像头搜索软件_ZOOM会议软件简要操作说明-安卓手机版
  7. 10种防止网络被攻击的方法
  8. T32:第一次出现的字符
  9. 关于在窗体之间传值的问题 C# winform
  10. 写贺卡给毕业师姐怎么写计算机系的,写给师姐的毕业祝福语赠言 送给师姐的毕业祝福语大全...
  11. 2021年最好的Laravel教程
  12. 优先级多路选择器和无优先级的多路选择器的区别
  13. 虚拟存储器与虚拟内存
  14. 深入浅出聊聊Java函数式编程思想
  15. crc-16 ccitt标准在哪里可以看到详细的
  16. jQuery的常见选择器和筛选器
  17. Android 模拟器加速
  18. 计算WPL·哈夫曼树构建及带权路径长计算
  19. java 优解分班_java设计一个按班级的分组排序,班级 姓名 学号 成绩 ,再输出每个班90分以上的人数,占比多少。...
  20. 【Mongoose】populate基本使用

热门文章

  1. 虚拟机实时迁移解决方案
  2. Oracle 11g 的官方支持周期和时限
  3. LINUX系统下监控DELL服务器硬盘状态
  4. 代理模式(Proxy) 静态
  5. 微信中location.reload失效
  6. SpringMVC 工作流程
  7. Sublime Text3的插件管理Package Control安装
  8. 【安卓8】文件的读写
  9. Selenium ide及webDriver使用
  10. 把一个下拉框中的选项添加到另一个中