• js 正则之 检测素数


    相信很多人应该看过这篇文章,我第一次看到的时候是11年的样子,那时候学vbs的时候看过这个问题。
    原文《检查素数的正则表达式》,在文章里已经解释了他是怎么判断的,我就不啰嗦了。
    我们来说说 js 如何实现它吧。

    先来看看什么是素数,在《质数 - 百度百科》里有详细的说明,而且也说了一些求素数的方法,什么6N+1法等。。
    这些什么算法都不是我们要谈的,我们只说正则。

    在那篇文章里给出的正则是 /^1?$|^(11+?)1+$/
    其实我觉得完全没必要检测 0 1 之类的,因为根据百度百科里的解释,素数是从 2 开始的。
    所以只要加一个判断条件 n < 2 的都不是素数,其他的则用 /^(11+?)1+$/ 进行验证即可,
    不仅提升了效率,而且防止传入负数而报错。

    我们先来写个遍历 n 以内素数的函数吧。

    /**
     * 遍历素数
     * @param  {Number} max 遍历 2-max 之间的素数
     * @return {Array}      返回 2-max 之间所有素数
     */
    function prime(max) {
        var re = new RegExp('^(11+?)\1+$'), // 检测质数正则
            str = '1', // 根据当前 i 生成对应个数 1 
            i = 1, // 计数器
            ret = []; // 质数结果集
        while (max > i++)
            re.test(str += '1') || ret.push(i);
        return ret;
    }
    var arr = prime(100);
    console.log(arr);

    在代码里发现  var re = new RegExp('^(11+?)\1+$')  为什么不直接写  var re = /^(11+?)1+$/  呢?
    回去翻下我写的几篇正则文章就会找到答案了。
    最传统的写法往往是嵌套循环来遍历素数,但是有了正则的帮助,代码简洁优雅。

    如果要判断素数的话,那就更简洁了。

    /**
     * 判断是否是素数
     * @param  {Number} n  要判断是数字
     * @return {Boolean}   返回 true|false
     */
    function isPrime(n) {
        return n < 2 ? false : !/^(11+?)1+$/.test(Array(n + 1).join('1'));
    }
    
    console.log(-2, isPrime(-2));
    console.log(1,  isPrime(1));
    console.log(2,  isPrime(2));
    console.log(11, isPrime(11));

    好了,今天的分享就这么点东西,虽然没什么实际用途,但是可以开阔大家的眼界。
    正则不仅仅就是匹配字符串,还能判断素数,二元/三元方程有无解等等等等看似不可思议的逻辑。

  • 相关阅读:
    jmeter笔记5
    jmeter笔记4
    jmeter笔记3
    jmeter笔记2
    jmeter笔记1
    robot API笔记4
    robotframework笔记27
    robotframework笔记25
    robotframework笔记26
    robotframework笔记24
  • 原文地址:https://www.cnblogs.com/52cik/p/js-regular-prime.html
Copyright © 2020-2023  润新知