编程小妙招:取模

来源:互联网 发布:手机金山恢复数据恢复 编辑:程序博客网 时间:2024/04/27 03:34

      数学中的取模运算大家都是知道的,现在说下自己利用这个运算的一些体会。

      首先,取模可以在一定程度上取消边界检查。

 

      举个例子吧,假设要在一个100x100的平面网格上实现生命游戏(game of life,一个数学游戏)的模拟,每个网格代表一个小细胞生命。在按照一定规则不断演化的过程中,细胞生命是必然会遇到边界的。我们是不是要加上if这样的判断来确定细胞生命是不是到了边界呢?如果没有这个检查的话,超出网格的操作就是非法的了。其实我们只需要简单地利用取模运算,就能避免这一问题。

       用   

           int up = ( x_pos - 1 + row )  %  row;
           int down = ( x_pos + 1 + row ) % row;
           int left = ( y_pos - 1 + col ) % col;
           int right = ( y_pos + 1 + col ) % col;

      算出一个在(x_pos,y_pos)处的细胞的上下左右的位置,这样完全避免了麻烦的判断。不过,这样处理之后,整个网格就是没有边界的一体的了,就像地球表面,一直向东走,最后却是从西边出来。正如走到最左边的细胞会从最右边出来一样。

 

      其次,取模可以在循环中排除一列元素中的一个。

      还是举例说明,考虑计算N阶矩阵的行列式大小的算法,可以用的是对矩阵的第一行按代数余子式展开。那么考虑第一行的第 i 个元素处的代数余子式,它是由1~i-1的列和i+1~N的列以及2~N的行组成的一个子行列式,就是说第一行和第 i 列的元素要被排除,那么我们可以利用

 

          for( i = 0;i < N;++i)

                for( j = i + 1;j!=i;j = (j + 1 + N)%N)

               {

                    //计算代数余子式

                }

 

          关键就在 j = (j + 1 + N)%N,它使循环从 i+1 进行到 N,然后从 0 到 i-1。

 

 

原创粉丝点击