博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 正则之检测素数
阅读量:6566 次
发布时间:2019-06-24

本文共 1230 字,大约阅读时间需要 4 分钟。

原文:

相信很多人应该看过这篇文章,我第一次看到的时候是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));

好了,今天的分享就这么点东西,虽然没什么实际用途,但是可以开阔大家的眼界。

正则不仅仅就是匹配字符串,还能判断素数,二元/三元方程有无解等等等等看似不可思议的逻辑。

转载地址:http://zupjo.baihongyu.com/

你可能感兴趣的文章
也许每个农村出来的码农都有个田园梦
查看>>
J2EE的13种核心技术
查看>>
Express.js 中的 Sessions 如何工作?(译)
查看>>
Web自动化之Headless Chrome概览
查看>>
【133天】尚学堂高淇Java300集视频精华笔记(71-72)
查看>>
剖析 Laravel 计划任务--事件属性
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
检查IP是否可用的方法
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
作为数据科学家,我都有哪些弱点
查看>>
(转)线程安全的CopyOnWriteArrayList介绍
查看>>
对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
查看>>
WPF TreeView HierarchicalDataTemplate
查看>>
32岁老程序员的现状和尴尬,无奈中透露些许悲凉,有选择却更痛苦
查看>>
WPF MeshGeometry3D
查看>>
puppet cron 模块
查看>>
mysql 协议的ResultsetRow包及解析
查看>>
Ymal格式转Properties格式
查看>>
一个生成全局唯一Sequence ID的高并发工厂类 (Java)
查看>>