这道题在网上没有搜到不用数组的代码pwp 下面是我写的一个不用数组的写法owo
看着这样的“回”形图案你晕吗?让我们不用数组,来做出它。
输入:
n。正方形的边长
输出:
边长为 n 的数字回形方阵。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
|
#include<stdio.h>
int printcycle(int acycle,int Line,int Size)//acycle:打印的是从外向内第几圈 Line:打印的行数 Size:总边长
{
int first=1,last,size=Size-2*(acycle-1),line=Line-acycle+1,nextcycle;
if(size<0) return 0; //first:这一圈左上角的数 last:左下角的数 size:这一圈的边长 line:打印的是这一圈的第line行
for(int i=2;i<=acycle;i++) first+=4*(Size-2*(i-2))-4;
last=first+3*(size-1); //计算出first和last
if(line==1) for(int i=0;i<size;i++) printf("%3d",first+i); //如果是这一圈的第一行 则直接打印出来
else if(line==size) for(int i=0;i<size;i++) printf("%3d",last-i); //如果是这一圈最后一行 直接打印出来
else if(1<line && line<size) //如果是中间行 先打印第一个数字 然后让圈数+1后再输入这个函数打印里面的圈
{
printf("%3d",first+4*(size-1)-line+1); //打印第一个数字
if(Line-acycle>0)
{
nextcycle=acycle+1;
printcycle(nextcycle,Line,Size); //打印里面的圈
}
printf("%3d",first+size+line-2); //打印第二个数字
if(acycle==1) printf("\n"); //如果打印完最外面,即第一圈的中间行的第一个数字,需要换行
}
}
int main()
{
int Size;
scanf("%d",&Size);
for(int Line=1;Line<=Size;Line++)
{
printcycle(1,Line,Size); //看似只循环打印出第一圈,但打印第一圈中间行时候,函数内的嵌套函数会执行,打印出内部的数字
if(Line==1 || Line==Size) printf("\n"); //第一行最后一行需要换行
}
return 0;
}