编程之美之将帅问题学习笔记

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