书中的第一种解法很容易理解,这里就不赘述,可是第二种算法百思不得其解。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--; } ?>