`
jy00509336
  • 浏览: 243626 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

检查素数的正则表达式

阅读更多

转载自:酷壳 – CoolShell.cn

用 JS 枚举质数

一般来说,我们会使用正规表达式来做字符串匹配,今天在网上浏览的时候,看到了有人用正则表达式来检查一个数字是否为素数(质数),让我非常感兴趣,这个正则表达式如入所示:

检查素数的正则表达式/^1?$|^(11+?)+$/

要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”, 17 要写成“11111111111111111”,这种工作使用一些脚本语言可以轻松的完成。

一开始我对这个表达式持怀疑态度,但仔细研究了一下这个表达式,发现是非常合理的,下面,让我带你来细细剖析一下是这个表达式的工作原理。

首先,我们看到这个表达式中有“|”,也就是说这个表达式可以分成两个部分:/^1?$/ 和 /^(11+?)\1+$/

  • 第一部分:/^1?$/, 这个部分相信不用我多说了,其表示匹配“空串”以及字串中只有一个“1”的字符串。
  • 第二部分:/^(11+?)\1+$/,这个部分是整个表达式的关键部分。其可以分成两个部分,(11+?)\1+$,前半部很简单了,匹配以“11”开头的并重复0或n个1的字符串,后面的部分意思是把前半部分作为一个字串去匹配还剩下的字符串1次或多次(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍)。

可见这个正规则表达式是取非素数,要得到素数还得要对整个表达式求反。通过上面的分析,我们知道,第二部分是最重要的,对于第二部分,举几个例子,

 

示例一:判断自然数8。我们可以知道,8转成我们的格式就是“11111111”,对于(11+?),其匹配了“11”,于是还剩下“111111”,而\1+$正好匹配了剩下的“111111”,因为,“11”这个模式在“111111”出现了三次,符合模式匹配,返回true。所以,匹配成功,于是这个数不是质数。

示例二:判断自然数11。转成我们需要的格式是“11111111111”(十一个1),对于(11+?),其匹配了“11”(前两个1),还剩下“111111111”(九个1),而\1+$无法为“11”匹配那“九个1”,因为“11”这个模式并没有在“九个1”这个串中正好出现N次。于是,我们的正则表达式引擎会尝试下一种方法,先匹配“111”(前三个1),然后把“111”作为模式去匹配剩下的“11111111”(八个1),很明显,那“八个1”并没有匹配“三个1”多次。所以,引擎会继续向下尝试……直至尝试所有可能都无法匹配成功。所以11是素数。

通过示例二,我们可以得到这样的等价数算算法,正则表达式会匹配这若干个1中有没有出现“二个1”的整数倍,“三个1”的整数倍,“四个1”的整数倍……,而,这正好是我们需要的算素数的算法。现在大家明白了吧。

下面,我们用perl来使用这个正规则表达式不停地输出素数:(关于perl的语法我就不多说了,请注意表达式前的取反操作符)

1 perl -e'$|++;(1 x$_)!~/^1?$|^(11+?)\1+$/&&print"$_ "while ++$_'

另外,让我们来举一反三,根据上述的这种方法,我们甚至可以用正则表达式来求证某方式是否有解,如:

  • 二元方程:17x + 12y = 51   判断其是否有解的正则表达式是:^(.*)\1{16}(.*)\2{11}$
  • 三元方程:11x + 2y + 5z = 115 判断其是否有解的正则表达式是:^(.*)\1{10}(.*)\2{1}(.*)\3{4}$

大家不妨自己做做练习,为什么上述的两个正则表达式可以判断方程是否有解。如果无法参透其中的奥妙的话,你可以读读这篇英文文章

 

翻译成 JavaScript 代码如下:

function prime(MAX) {
    var re = /^(11+?)\1+$/,
        n, C = '1', s = C,
        r = [], j = 0;

    while ((n = (s += C).length) < MAX) {
        !re.test(s) && (r[j++] = n);
    }
    return r;
}
alert(prime(10000).length);

作为前端,为了让上面的脚本能在实际页面中应用,还得考虑 脚本在浏览器中的耐心 以及 分时优化处理

最后,请猛击测试页面:prime-number.html

分享到:
评论

相关推荐

    正则表达式(很有用的东西)

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和解析字符串。在Java中,正则表达式被广泛应用于数据验证、文本分析和文件操作等领域。理解并熟练掌握正则表达式对于任何Java开发者来说都是至关重要的。...

    检查素数的正则表达式分享

    正则表达式检查素数的原理,实际上是利用了正则表达式的匹配规则来寻找是否存在某个模式的整数倍。这一规则恰好对应了素数的定义:除了1和它本身外,没有其他数能够整除它。 通过Perl脚本,可以使用这个正则表达式...

    用正则表达式来判断素数的代码

    代码如下:import re def is_prime(num): return not re.match(r”^1?$|^(11+?)\1+$”, ‘1’ * num)这个... 您可能感兴趣的文章:php 求质素(素数) 的实现代码JS 用6N±1法求素数 实例教程检查素数的正则表达式分享

    素数判定与线性方程求解

    #### 二、使用正则表达式判定素数 正则表达式的强大之处在于其灵活性和表达能力。在本文档中提到的正则表达式 `^1?$|^(11+?)\1+$` 是一个非常有趣的例子,它可以用来判断一个由连续的字符 `'1'` 组成的字符串的长度...

    VBS 正则判别素数(质数)

    在VBS(Visual Basic Script)脚本语言中,利用正则表达式判断一个数是否为素数(质数)是一种非常巧妙且不常见的方法。素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。例如,2、3、5、7等都是...

    python.docx

    在Python中,可以通过循环和模运算来检查一个数是否为素数。对于201到300之间的所有整数,我们可以遍历这个范围,用sqrt函数找出可能的最大因数,如果能被整除,则不是素数,否则就是素数。最后统计并输出素数的数量...

    深信服笔试2022可用.pdf

    【网络资源】相关的知识点主要涉及TCP/IP协议、网络通信方式、路由协议、操作系统特性、软件测试及性能指标、正则表达式、网络安全设备的笔试题目。以下是对这些知识点的详细解释: 1. TCP断开连接是四次握手,即...

    5.25-5.28周作业(文件)1

    6. **正则表达式和标识符命名规则**:判断输入的字符串是否符合Python标识符命名规则,需要用到正则表达式。Python的`re`模块提供了正则表达式的相关函数,如`match()`,`search()`,`fullmatch()`等。 7. **字幕...

    python组合数据类型

    2. **正则表达式**:Python中的`re`模块提供了正则表达式的操作,可以用于字符串的匹配、替换和分割等。基本语法包括字符集`[]`、量词`*`、`+`、`?`、`{m,n}`等。 3. **列表操作**: - **切片**:通过索引和步长...

    JavaScrpt判断一个数是否是质数的实例代码

    在上述代码中,`Array(num + 1).join('1')`生成的字符串长度与`num`相同,如果`num`是质数,那么这个字符串不会匹配正则表达式,反之则会匹配。 这两种方法各有优缺点。非正则实现法虽然看起来更直观,但需要进行多...

    python语言程序设计(刘卫国)实验指导_部分答案.doc

    【Python语言程序设计实验指导】 ...这些实验涵盖了Python的基础知识,包括变量、运算符、控制流、字符串处理、正则表达式、数据结构(列表和元组)等。通过这些实验,学生能够加深对Python编程的理解和实践能力。

    Java SE编程入门教程 java 常用API(共22页).pptx

    正则表达式是用于文本匹配和查找的强大工具,Java提供了`Pattern`和`Matcher`类来支持正则表达式操作。 以上只是Java SE编程入门部分核心知识点的概述,实际上,每个主题都包含更深入的概念和技术,需要通过学习和...

    全国计算机等级考试三级网络技术.pdf

    - 正则表达式与模式匹配:虽然题目没有直接要求正则表达式,但理解模式匹配的概念对于实现`StrOL`函数(单词倒序)至关重要,即使是在简单的字符级别。 5. **条件判断与逻辑控制** - 条件语句:在`jsVal`和`StrOR...

    JAVA常用方法集合

    它使用了正则表达式来匹配输入的字符串,如果匹配成功,则返回`true`,表示该字符串是由汉字组成的;否则返回`false`。 **代码实现**: ```java public static boolean isChinese(String str) { Pattern pattern =...

    flash(as3)工程师 面试 笔试题

    判断素数的基本方法是从2开始,依次检查到其平方根,如果该数可以被任何小于等于其平方根的数整除,就不是素数。例如,可以用以下AS3代码实现: ```actionscript function isPrime(num:uint):Boolean { if (num ) ...

    北航2008,2009上机题

    这需要使用字符串处理和正则表达式的概念。可以使用滑动窗口或KMP算法来实现高效的字符串匹配,同时处理模式匹配的逻辑。 4. **立方根的逼近迭代法**: 提供了一个迭代公式来计算立方根,这是一种数值计算方法。...

Global site tag (gtag.js) - Google Analytics