美文网首页
正则表达式-判断二进制数是否被3整除

正则表达式-判断二进制数是否被3整除

作者: kamionayuki | 来源:发表于2016-02-21 22:24 被阅读1134次

reg = /^(0+|0*1((10*1)|(01*0))*10*)$/
其中

  • 0+表示字符串可以全为0
  • 第一个0*表示字符串可以以0开头
  • 核心的句式是:1((10*1)|(01*0))*10*)
    原理如下:
    一个二进制数后面加一个“0”相当于该数乘以2,一个二进制数后面加一个“1”相当于该数乘2加1
    设定三个状态,分别叫做0、1和2,它们表示当前的数除以3所得的余数。有以下的几种可能:
0@0 => 0 表示状态0后面是0时,变成状态0
0@1 => 0 表示状态0后面是1时,变成状态1
1@0 => 2 表示状态1后面是0时,变成状态2
1@1 => 0 表示状态1后面是1时,变成状态0
2@0 => 1 表示状态2后面是0时,变成状态1
2@1 => 2 表示状态2后面是1时,变成状态2

状态0既是我们的初始状态,也是我们的最终状态。我们的自动机就做好了。现在,假如二进制数10010走进来了。从状态0出发,机器首先读到一个“1”,于是当前位置挪到状态1,表明目前该数模3余1;然后,系统读了一个“0”,我们紧跟着走到状态2,表明二进制数“10”被3除余2;下一步,我们回到状态1,表明“100”除以3余1;再往后,我们得知“1001”能被3整除。最后呢,我们读到一个0,“1001”的两倍当然还是能被3整除,我们依旧停留在原位。我们得到结论:二进制数10010能被3整除。
有限状态自动机是可以转化为正则表达式的。上面的这个自动机转化起来非常容易。我们可以先试着用自然语言叙述一下。首先,每个二进制数第一位必然为“1”。到达状态1后,我们可以随意地、任意多次地在状态1周围绕圈圈,最终回到状态1。临近末尾,我们再读到一个“1”返回状态0,这之后随便读多少个“0”都可以了。现在问题分解为:我们又如何用正则表达式表述“从状态1出发随意地走最终回到状态1”呢?在本例中,这是很好描述的:它可以是字符串“1000..001”和“0111..110”的任意组合。把这些东西用正则表达式写出来,就是我们刚才那个神秘的式子:1((10*1)|(01*0))*10*

参考这里

相关文章

  • Day3 作业

    写出判断一个数是否能同时被3和7整除的条件语句 写出判断一个数是否能够被3或者7整除,但是不能同时被3或者7整除 ...

  • Day3-运算符&变量&作业

    作业 写出判断一个数是否能同时被3和7整除的条件语句 写出判断一个数是否能够被3或者7整除,但是不能同时被3或者7...

  • 正则表达式-判断二进制数是否被3整除

    reg = /^(0+|0*1((10*1)|(01*0))*10*)$/其中 0+表示字符串可以全为0 第一个0...

  • 简单算法题

    斐波那契数列 判断一个数是否是质数(只能被1和本身整除) 判断是否是丑数丑数就是只包含质因数 2, 3, 5 的正...

  • 作业002:变量与运算符部分

    1. 写出判断一个数是否能同时被3和7整除的条件语句, 并且打印对应的结果。  eg: 2. 写出判断一个数是否能...

  • 数字求和法

    数字求和法即通过一个数各数位上的数字和来判断这个数能否被某个数整除。 1、被3整除数字和是3的倍数 2、被9整除数...

  • Python测试题

    打印9 * 9乘法口诀表: 判断是否是闰年: 能被4整除但不能被100整除,或者可以被400整除

  • java的基础语法练习

    1.求某个范围之间同时能被3和7整除的数。 要注意用&&。 2.求某个范围之间奇数之和。 3.判断某个数是否是质数...

  • 数学基础常识-数论-自然数整除性质及证明

    整除的概念: 整除的判断规则: 1、被2、5整除:末位被2、5整除。 2、被4、25整除:末两位被4、25整除 3...

  • 逻辑分支和嵌套三目运算

    问题:找出1~100中所有能被3整除,或者能被5整除,或者既能被3整除又能被5整除的数。   如果只是单纯的问题求...

网友评论

      本文标题:正则表达式-判断二进制数是否被3整除

      本文链接:https://www.haomeiwen.com/subject/dnxbkttx.html