用正则判断能否被3整除
问题
【用正则判断能否被3整除】使用正则判断n能否被3整除
思路
根据整除性构建DFA(确定有限自动状态机),再根据DFA构建正则(Kleen算法)
解决
我们从高位读取字符串,并将余数作为状态,有如下状态转移表:
X |'0''1'
0 | 0 1
1 | 2 0
2 | 1 2
(X表示 状态\当前字符)
比如说状态是2,说明当前数字除3余2,那么当前字符是'0'时,余数自然是1,应该转移到1状态
DFA如下:
文章图片
DFA 初始状态是0,我们只要判断终结状态是否为0即可
观察图中的一个自环和一个0-1-2-1-0的大环,我们可以写出两种正则
0*
1(01*0)*1
故得到 (0 | 1(01*0)*1)*
代码
for(var i=1;
i<100;
i++)
if(!/^(0|1(01*0)*1)*$/.test(Number(3*i).toString(2))) console.log(i)//undefined
Tips
- 符合要求的正则不止一个,但是上述正则应该是最简单的之一
- 按照相应算法,可以获得任意数字的整除性判断正则
https://en.wikipedia.org/wiki/Kleene%27s_algorithm
https://zhidao.baidu.com/question/1383837207982172220.html
Algorithm 4th P518
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。