能被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整除。
-
对开始符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)|ε
,本质上没有区别,为了统一下面我们都将非终结符写到右边。) -
-
对非终结符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
-
-
对非终结符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