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*/
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 */
至此,程序的功能已经一目了然,无需多言了。
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*/
2 1[原创文章,转载请保持文章完整,并注明出处。更多精彩文章请访问http://blog.csdn.net/Jupin编译运行,当使用4作参数时,结果是
或者 http://hi.baidu.com/qiupingwu]
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 */
至此,程序的功能已经一目了然,无需多言了。