除余取模的算术变化特点,模的变化特点
前言
这是一篇我记在 麦库 上的笔记,现在移动到博客园来。
i%x 的结果一定是 0~x-1 内。且随着 i 整数的顺序递增或递减。 其也在 0~x-1 的范围内周期变化。
相比于 i/x i%x, 当i整数 循序递增或递减时,i/x 的结果变化1时,i%x 的结果变化 一个周期。
例如: i=81;
then i/9 =9;
and i%9=0;
i--;
i/9=8;
i%9=8;
i--;
i/9=8;
i%9=7;
i--;
i/9=8;
i%9=6;
分析 由于 i/9 可以得知i 为9的倍数,如果变化率没有相对于除数的倍数变化,则除的结果是不会变化的,而被除数的变化则反映到了余数上。
示例:
中国象棋中 将帅 组合问题(求出将帅位置组合) 解法应用:
int i=81;
while(i--)
{
if(i/9%3==i%9%3)
continue;
printf("A=5d,B=%d\n",i/9+1,i%9+1);
}
解析:
由于i=0对将帅的位置程序编号为:
0 1 2
3 4 5
6 7 8
=====
0 1 2
3 4 5
6 7 8
可看出将帅的位置组合为 9×9 =81 钟
判断将帅是否在同一纵轴上 可以用 x%3==y%3 的方法。
i/9 表示了, 0~8 的变化范围,由上面的规律可以知道。
当 i递减时, i/9 变化一次 ,i%9 变化9次 即一个周期, 而这刚好是固定将A 的位置, 而帅B 所有位置都走一遍的组合。
因此 i/9%3==i%9%3 表示 两者在同一纵轴上。
(i/9,i%9)
就是所有的81总组合。