書中的第一種解法很容易理解,這裏就不贅述,可是第二種算法百思不得其解。if((i / 9) % 3 == (i % 9) % 3) 是個什麼意思。。。。。百度了很多資料,發現正解不多。。 php
讓我恍然大悟的連接 https://book.douban.com/annotation/13753057/,因此這裏Mark一記算法
這裏的取模運算究竟是個什麼意思?????黑人問號服務器
一般狀況下來講,我用到取模運算的地方就是負載均衡的時候,經過一個獨立的UUID進行取模,而後分配到指定的服務器上,例如個人UUID=1,小明的UUID=8,可是我只有兩組服務器,如何保證我每次進來的時候分配的服務器是同一臺呢。這裏就用到了取模 %2便可。負載均衡
「能夠把變量i想象成一個兩位九進制的變量,而i在計算機中存儲的值是i的十進制表示。則i/9的計算機處理結果,即結果直接去掉小數點後部分的結果便是此九進制數的第二位,而i%9便是此九進制數的個位。本程序用此九進制數的第二位保存A的位置,個位表示B的位置。最大值爲88,即爲十進制的80.程序從十進制的80,即九進制的88遍歷到十進制的0,即九進制的0.將符合條件的位置所有輸出。」 引用 https://book.douban.com/annotation/13753057/spa
書中的這種解法只用了一個數去存儲兩個將帥出現的位置,這裏採用了9進制存儲,其中兩位是分別存儲不一樣將帥的位置。code
這裏2位存儲9進制的最大值爲88,換算成10進製爲80,循環到10進制的0,總共有81種狀況。blog
假設第一位存儲將帥A可能出現的位置,第二位存儲將帥B可能出現的位置io
這裏的除9表示取第二個將帥的位置,學到了,(例如 99/10 /10=取十位的數字9, %10=個位數字9)小學除法的含義都還給老師了。。。慚愧。。。。。。。。。。class
模3比較好理解,就是取將帥出現的第幾列,由於總共只有三列因此就是模3了。變量
由於while先會執行 i--, 這裏將i的初值設爲81
BYTE i = 81; while(i--) { if((i / 9) % 3 == (i % 9) % 3) continue; printf("A = %d, B = %d\n", i /9 + 1, i%9 + 1); } return 0;
我這裏用php寫了一份,我的以爲更好理解一些吧
由於開始最大值爲88,其實到00也會須要執行,這裏用了intval而不能用round是由於,round是四捨五入,intval不會。
round(3.6) = 4
intval(3.3) = 3
<?php $i = 80; while ($i >= 0) { if (intval(intval(($i / 9)) % 3) != intval(intval(($i % 9)) % 3)) { var_dump('A:' . (intval(($i / 9)) + 1), 'B:' . (intval(($i % 9)) + 1)); } $i--; } ?>