使用BNF(Backus Naur Form)文法,產生二進位數字,其值為3的倍數。第一次看到這題是95年高考程式語言的題目,答案如下:
<N3> ::= <N3>0 | <N1>1 | 0
<N1> ::= <N2>0 | <N3>1 | 1
<N2> ::= <N1>0 | <N2>1
解了好久,最後求助Google大神,才能有系統解出。
以3為基準來表示數字,會有三種數字 3n、3n+1、3n+2,也就是3的倍數、3的倍數+1、3的倍數+2,共3種。
以<3n>、<3n+1>、<3n+2>表示這三種數字的集合。
<3n> (3的倍數) 如果為1位數時 <3n>::=0。
<3n>不只1位數時,假設<3n>::= <A>0 | <B>1,<A>、 <B>為<3n>、<3n+1>、<3n+2>其中之1。
求<A>*2+0 、<B>*2+1 為三的倍數時,<A>、 <B>的值?
得<3n>*2、<3n+1>*2+1 為三的倍數,即<3n>::= <3n>0 | <3n+1>1。
綜合兩項得<3n>::= <3n>0 | <3n+1>1 | 0
再來求<3n+1> (3的倍數+1)
<3n+1>如果為1位數時 <3n+1>::=1。
<3n+1>不只1位數時,假設<3n+1>::= <C>0 | <D>1,
求<C>*2+0 、<D>*2+1為3的倍數+1時,<C>、 <D>的值?
得<3n+2>*2+0 、 <3n>*2+1為3的倍數+1,即<3n+1>::= <3n+2>0 | <3n>1。
綜合兩項得<3n+1>::= <3n+2>0 | <3n>1 | 1
最後求<3n+2> (3的倍數+2)
<3n+2>為1位數時無解,故假設<3n+2>::= <E>0 | <F>1,
求<E>*2+0、<F>*2+1 為3的倍數+2時,<E>、 <F>的值?
得<3n+1>*2、 <3n+2>*2+1 為3的倍數+2,即<3n+2>::= <3n+1>0 | <3n+2>1
令<N3>= <3n>、<N1>=<3n+1>、<N2>=<3n+2>,即可求得答案。

嗨,您好,想請問您「以3為基準來表示數字」這句的意思是什麼? 「3的倍數+1、3的倍數+2」如果 +1 或 +2 了,結果怎麼還會是「3 的倍數」呢?
以3為基準來表示數字,會有三種數字3n、3n+1、3n+2,也就是3的倍數、3的倍數+1、3的倍數+2,這是在說明任一整數都可用這3種式子表示。「3的倍數+1、3的倍數+2」當然不是「3的倍數」。 使用BNF文法產生二進位數字,其值為3的倍數,要從低位數開始解。 該數為1位數時,3的倍數是0,得<3n>::=0 不只1位數時,第1位不是0就是1,故假設3的倍數為<3n>::=<A>0|<B>1,參考原文章,求<A>和<B>的值。BNF需算到沒有還未出現過的數,所以要繼續算到都解開。