被3整除整数的文法表示——编译原理

能被3整除整数的文法表示

此题为编译原理相关题目,考察文法表示相关内容。

原文地址:被3整除整数的文法表示

题目

写出所有能被3整除的十进制整数的文法表示。(注:为方便表示,规定整数首位可以为0,即018此种表示是合法的,就是整数18。)

分析

由数学知识可以得到,如果整数的每个位上的数字相加之和可以被3整除,则此整数可以被3整除。

因此,我们用是否可以被3整除为标准,将0-9这十个数字分成三组。

  • 0,3,6,9:可以被3整除
  • 1,4,7:被3整除余1
  • 2,5,8:被3整除余2

文法表达式为:G=(V N _N N,V T _T T,P,S),其中

  • V N _N N={S,A,B},非终结符集合
  • V T _T T={0,1,2,3,4,5,6,7,8,9},终结符集合
  • S为开始符

接下来重点研究的是P中规则的集合。

首先,在数字中加上{0,3,6,9}此类数字时,不影响数字的整除性,即若原本的数字可被3整除,则加上{0,3,6,9}此类数字后,依旧可以被3整除;若原本数字就不能被3整除,则加上{0,3,6,9}此类数字后,依旧不能被3整除。

其次,将1,4,7中的任意一个数字与2,5,8中的任意一个相加,可以被3整除。

  1. 对开始符S

    • 若和0,3,6,9组合,无影响,即S->(0|3|6|9)S|ε,其中ε为空串,用来结束这个字符串。

    • 若和1,4,7组合,我们用一个非终结符A来表示,有S->(1|4|7)A

    • 若和2,5,8组合,我们用一个非终结符B来表示,则S->(2|5|8)B

    (注:此处我们可以使用S->(0|3|6|9)S|ε,也可以使用S->S(0|3|6|9)|ε,本质上没有区别,为了统一下面我们都将非终结符写到右边。)

  2. 对非终结符A,其左边是1,4,7三个数字。

    • 若和0,3,6,9组合,无影响,即A->(0|3|6|9)A

    • 若和2,5,8组合,则正好凑成了可以被3整除的数字,此时的情况与0,3,6,9相同(因为0,3,6,9也可以被3整除),由1中我们可以得到A->(2|5|8)S

    • 若和1,4,7组合,相加后被三除余2,此时的情况与2,5,8相同(因为2,5,8被3除也余2),于是由1中我们可以得到A->(1|4|7)B

  3. 对非终结符B,其左边是2,5,8三个数字,其分析与上述A的分析相似,此处不再赘述。

结果

将上面的所有分析结合起来,就可以得到P的规则如下:

S->(0|3|6|9)S|(1|4|7)A|(2|5|8)B|ε

A->(0|3|6|9)A|(2|5|8)S|(1|4|7)B

B->(0|3|6|9)B|(1|4|7)S|(2|5|8)A

有些类似递归的思想。

例子

任意任意一个可被3整除的整除都可以由上述文法表示,例如17862,文法表示如下

S-> 1A -> 17B -> 178A -> 1786A -> 17862S -> 17862

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值