多种方法实现素数的判断

原文:多种方法实现素数的判断

素数的定义:

指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。

我将给出几种实现对自然数n进行素数的判断方法,主要从代码的执行效率上考虑这个问题。

首先,根据素数的定义,大家都会想到的一个方法就是遍历2~n-1,如果n能被其中的数整除,则n不是素数,否则为素数。

代码:

 1 //方法1(遍历)
 2 int prime_1(int n)
 3 {
 4    for(int i=2;i<n;i++)
 5   {
 6       if( n%i==0 )
 7          return 0;
 8   }
 9   return 1;
10 }


方法1最多的循环次数为:n-2,虽然能够解决问题,但这不是一个好方法。如果n值很大,可以采用另一种方法,就是对n开根号,只需遍历2~根号n。

代码:

 1 //方法2(对n开根号)
 2 int root(int n)
 3 {
 4    return (int)sqrt( (float)n );
 5 }
 6 int prime_2(int n)
 7 {
 8     for(int i=2;i<=root(n);i++)
 9    {
10       if( n%i==0 )
11          return 0;
12    }
13    return 1;
14 }


细心的你可能会发现,在for循环中,虽然循环次数会减少,但是每次循环都要调用root(int n)函数,我们知道开根号计算在计算机中是非常耗费时间的,如果每次循环都要计算一次,程序的效率肯定不会高,由于n的开根号的值在程序运行过程中是不变的,可以用一个变量将这个值保存起来,每次循环不需要再去计算,只需取变量的值即可。

代码:

 1 //方法3(只算一次开平方)
 2 int prime_3(int n)
 3 {
 4   int bound=root(n);
 5   for(int i=2;i<bound;i++)
 6   {
 7       if( n%i==0 )
 8          return 0;
 9   }
10   return 1;
11 }


我们可以进一步进行考虑,素数肯定不会是偶数(因为所有的偶数都能被2整除,所以所有的偶数都不是素数),并且2、3、5都是素数,比2、3、5都要大的数如果能被2或者3或者5整除,那么这个数也不是素数。
  根据这个思路,我们就有了第4种判断素数的方法。

代码:

 1 //方法4(排除被2、3、5整除的数以及偶数)
 2 int prime_4(int n)
 3 {
 4    if( n%2==0 )
 5        return (n==2);
 6    if( n%3==0 )
 7        return (n==3);
 8    if( n%5==0 )
 9        return (n==5);
10
11    int bound=root(n);
12    for(int i=7;i<=bound;i+=2)  //偶数不是素数,不进行遍历
13   {
14        if( n%i==0 )
15            return 0;
16    }
17    return 1;
18 }


现在我们的代码的执行效率比较高了,相对于第1种方法,循环执行的次数降低了不少,但是还有一个很影响程序执行效率的因素,那就是对n开根号的计算,开根号计算很耗费时间,因此我们需要消除开根号的计算。我们可以将开根号计算转换成乘法计算,乘法计算就要比开根号计算要快了,具体的实现过程请看以下的代码。
代码:

1 //方法5(乘法代替开方)
2 for(int i=7;i*i<=n;i+=2)
3 {
4    if( n%i==0 )
5        return 0;
6 }
7 return 1;


总结:以上的5中判断素数的方法是从程序的执行效率出发的,影响一个程序的执行效率有代码的执行行数,以及代码每行代码消耗的时间长度,
          因此减少循环次数以及将开根号计算代替为乘法运算等这些优化对执行效率都是有提高作用的。

附:以上的代码参考了《编程珠玑》这本书,从书上学到了这些优化方法,提供给大家一起学习和分享。

时间: 2024-08-03 09:31:09

多种方法实现素数的判断的相关文章

[转] 多种方法实现素数的判断

素数的定义: 指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数. 我将给出几种实现对自然数n进行素数的判断方法,主要从代码的执行效率上考虑这个问题. 首先,根据素数的定义,大家都会想到的一个方法就是遍历2~n-1,如果n能被其中的数整除,则n不是素数,否则为素数. 代码: //方法1(遍历)int prime_1(int n){ for(int i=2;i<n;i++) { if( n%i==0 ) return

js判断移动端是否安装某款app的多种方法

第一种方法: 一:判断是那种设备 var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 二:安卓设备:原理:判断是否认识这个协议,认识则直接跳转,不认识就在这里下载app android(); if(isAndroid){ function an

VC开发多语言界面 多种方法(很简单) 有源码

(需源码先留邮箱)先上图 1.通过遍历 得到所有控件ID号与TEXT,得到一个中文语言配置文件 void CVV_485Dlg::getCaptionForWindow() //做程序时用,其它时间不用 { //枚举对话框中所有组件 CWnd *pCtrl = GetWindow(GW_CHILD); while(pCtrl!=NULL) { UINT ctrlID = pCtrl->GetDlgCtrlID(); // setControlCaption(pCtrl,ctrlID); CStr

对素数的判断和素数个数的判断

应该说这是比较高效的解题方法了吧. 素数个数计数: class Solution { public:     int countPrimes(int n) {        bool* a = new bool[n];        for(int i=2; i*i<n; i++) {           if(!a[i]) {               for(int j=i; i*j<n; j++) {                   a[i*j] = true;          

Num 19: 最大公约数.最小公倍数.素数的判断

在c语言的学习之中,经常会碰到: 计算最大公约数,最小公倍数和素数判断的问题: 在这里由浅入深总结一下: 1. 最大公约数与最小公倍数 : 由数学知识我们知道:       两个数的最小公倍数 = 这两个数的乘积 / 两个数的最大公约数:    所以求最大公约数和最小公倍数的问题其实是一类问题:  ①.最小公倍数:      方法一:        若 x>y ,从 x开始,判断x能否被y整除(x%y==0):        若能够整除,x既为最小公倍数:        若不能整除,计算2x,3

PHP读取文件多种方法与实例教程

分享下PHP中读取文件的八种方法,收集了很多php读取文件的例子,小而经典,是学习php文件操作的好资料. PHP中读取文件的几个方法,备阅.1.freadstring fread ( int $handle , int $length )fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件,视乎先碰到

php导出excel(多种方法)

php导出excel(多种方法)   分类: php 基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件. 优点:简单. 缺点:难以生成格式,如果用来导入需要自己分别编写相应的程序. 2:Excel格式,与类Excel相对应,这种方法生成的文件更接近于真正的Excel格式. 如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$

C语言轻松高效学习方法之:多种方法实现

多种方法实现同一个功能,可以调动你学的所有知识去做,有助于你学的融会贯通. 下面举例来看: 实现功能:求一个整数的位数: 实现语言:C语言: 开发环境:Visual Studio 2017 如:3215是4位数 实现原理: 3215/10 = 321 ----1位数 321/10 = 32 ----又是1位数 32/10 = 3 ----又是1位数 3/10 = 0 ----又是1位数 共4位数,且终止计算条件是/10结果为0的时候: 根据这个原理,先写一个最笨的原始方法: 效果: 这种实现方案

EditText监听方法,实时的判断输入多少字符

最近在写一个小项目,其中有一点用到了显示EditText中输入了多少个字符,像微博中显示剩余多少字符的功能.在EditText提供了一个方法addTextChangedListener实现对输入文本的监控.下边是我自己写的一个Demo. 代码实现: 布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.