代码讨论来自QQ群:
Bash/Awk/Sed CU联盟: 302706076
题目: 如图, 用程序的方法打印数字的螺旋结构!
方法一(来自CU blackold(传说中的黑哥)), 逆时钟打印数字, 代码如下:
BEGIN{
n=(int(sqrt(N)/2)-sqrt(N)/2)?int(sqrt(N)/2)+1:int(sqrt(N)/2);
for(i=1;i<=2*n;i++){
for(j=1;j<=2*n;j++){
if(j+i-1<2*n)
v=j>=i?4*(n-i)^2-j-i+2*n+1:4*(n-j)^2-3*j+i+2*n+1
else
v=j<=i?4*(i-n-1)^2+j+5*i-6*n-3:4*(j-n-1)^2+7*j-i-6*n-3
if(v>N) printf("%6s","")
else printf("%6d",v);
}
print ""
}
}
方法二(来自CU yinyuemi(SS大师, 生物博士)), 顺时钟打印数字,代码如下:
BEGIN{
srand();
w=sqrt(N);
w=int(w)==w?(w%2?w:w+1):(int(w)%2?int(w)+2:int(w)+1);
cl=(w+1)/2;
x=y=cl;
a[x][y]=1;
s=1;
for(i=2;i<=cl;i++){
y++;
x--;
while(k++<(i-1)*2&&s<N){x++;a[x][y]=++s}
while(--k>0&&s<N){y--;a[x][y]=++s}
while(k++<(i-1)*2&&s<N){x--;a[x][y]=++s}
while(--k>0&&s<N){y++;a[x][y]=++s}
}
for(i=1;i<=w;i++){
for(j=1;j<w;j++)printf ("%6s",a[i][j]);
printf ("%6s\n",a[i][j]);
}
}两位大神都是使用的 awk, 再此再次膜拜一下
收藏!!!
执行结果如下图所示:
2万+

被折叠的 条评论
为什么被折叠?



