zoukankan      html  css  js  c++  java
  • 编程之美之将帅问题学习笔记

         书中的第一种解法很容易理解,这里就不赘述,但是第二种算法百思不得其解。if((i / 9) % 3 == (i % 9) % 3) 是个什么意思。。。。。百度了不少资料,发现正解很少。。       

         让我恍然大悟的链接  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/

          书中的这种解法只用了一个数去存储两个将帅出现的位置,这里采用了9进制存储,其中两位是分别存储不同将帅的位置。

          这里2位存储9进制的最大值为88,换算成10进制为80,循环到10进制的0,总共有81种情况。

          假设第一位存储将帅A可能出现的位置,第二位存储将帅B可能出现的位置

          这里的除9表示取第二个将帅的位置,学到了,(例如 99/10  /10=取十位的数字9, %10=个位数字9)小学除法的含义都还给老师了。。。惭愧。。。。。。。。。。

          模3比较好理解,就是取将帅出现的第几列,因为总共只有三列所以就是模3了。

          因为while先会执行 i--, 这里将i的初值设为81

        BYTE i = 81;
        while(i--)
        {
            if((i / 9) % 3 == (i % 9) % 3)
                continue;
            printf("A = %d, B = %d
    ", 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--;
    }
    ?>
  • 相关阅读:
    用hmac验证客户端的合法性
    初级版python登录验证,上传下载文件加MD5文件校验
    用python实现一个简单的聊天功能,tcp,udp,socketserver版本
    用struct模块解决tcp的粘包问题
    最简单的socket通信
    python中的单例模式
    python中的反射
    前端工程化思想
    h5移动端flexible源码适配终端解读以及常用sass函数
    Vue生命周期函数详解
  • 原文地址:https://www.cnblogs.com/i0ject/p/7696630.html
Copyright © 2011-2022 走看看