现在的位置: 首页 > 综合 > 正文

模糊C代码分析-1984(2)

2013年07月27日 ⁄ 综合 ⁄ 共 2098字 ⁄ 字号 评论关闭
 1984年模糊C大赛的另一个代码:

a[900];        b;c;d=1        ;e=1;f;        g;h;O;        main(k,
l)char*        *l;{g=        atoi(*        ++l);        for(k=
0;k*k<        g;b=k        ++>>1)        ;for(h=        0;h*h<=
g;++h);        --h;c=(        (h+=g>h        *(h+1))        -1)>>1;
while(d        <=g){        ++O;for        (f=0;f<        O&&d<=g
;++f)a[        b<<5|c]        =d++,b+=    e;for(        f=0;f<O
&&d<=g;        ++f)a[b        <<5|c]=        d++,c+=        e;e= -e
;}for(c        =0;c<h;        ++c){        for(b=0        ;b<k;++
b){if(b        <k/2)a[        b<<5|c]        ^=a[(k        -(b+1))
<<5|c]^=    a[b<<5        |c]^=a[        (k-(b+1        ))<<5|c]
;printf(    a[b<<5|c    ]?"%-4d"    :"    "        ,a[b<<5
|c]);}        putchar(    '/n');}}    /*Mike        Laman*/
[原创文章,转载请保持文章完整,并注明出处。更多精彩文章请访问http://blog.csdn.net/Jupin 
或者 http://hi.baidu.com/qiupingwu]

编译运行,当使用4作参数时,结果是

2   1   
3   4
使用8作参数是,结果是
    8   7   
2   1   6   
3   4   5  
从中心点的1开始,螺旋式展开,样子还是比较有趣的。为了好看,先对代码动下手术,格式化的代码如下:
int a[900], b, c, d = 1, e = 1, f, g, h, O;
int main(char k, char **l)
{
    g = atoi(*++l);

    /*
     * b为数阵第一个起点的横坐标, 其值为[向下取整sqrt(g)]/2
     * k为数阵的横向宽度,其值为[向上取整sqrt(g)]
     */
    for (k = 0; k * k < g; b = k++ >> 1);

    /*
     * h为数阵纵向高度,其值为[向下取整sqrt(g)]
     */
    for (h = 0; h * h <= g; ++h);
    --h;

    /*
     * h += (g > (h * (h + 1))); [h为数阵最大高度]
     * c = (h - 1) >> 1;         [c为数阵第一个起点的纵坐标]
     */
    c = ((h += g > h * (h + 1)) - 1) >> 1;

    /*
     * d为数阵中即将要显示的数字
     */
    while (d <= g)
    {
        /*
         * 当前数字螺旋的边长
         */
        ++O;

        /*
         * 横向置满一行
         */
        for (f = 0; f < O && d <= g; ++f)
            /*
             * 每置一个数字, b按步长e移动
             */
            a[b << 5 | c] = d++, b += e;

        /*
         * 纵向置满一列
         */
        for (f = 0; f < O && d <= g; ++f)
            a[b << 5 | c] = d++, c += e;

        /*
         * 步长方向反转
         */
        e = -e;
    }

    /*
     * 将存于数组中的数阵显示出来
     */
    for (c = 0; c < h; ++c)
    {
        for (b = 0; b < k; ++b)
        {
            if (b < k / 2)
                /*
                 * 连续异或操作, 实现左右对称互换. 根据是A=(A^B^B).
                 */
                a[b << 5 | c] ^= a[(k - (b + 1)) << 5 | c]
                             ^= a[b << 5 | c]
                              ^= a[(k - (b + 1)) << 5 | c];
            printf(a[b << 5 | c] ? "%-4d" : "    ", a[b << 5 | c]);
        }
        putchar('/n');
    }
}                               /* Mike Laman */

至此,程序的功能已经一目了然,无需多言了。

【上篇】
【下篇】

抱歉!评论已关闭.