注意:前提条件 n>=1&&n<=10;最后输出结果占三位
1.思路解析
其实就是从外到内一圈又一圈的循环
2.代码解析
(1)创建二维数组来存储每行每列的各个数字
(2)按从左到右,从上到下,从右到左,从下到上的顺序依次存储和输出
(3)定义第一行为top,最后一行为bottom
定义第一列为left,最后一列为right
(4)
第一行从左到右代码为
int sum=0;//sum是每个位置的数的值
int left = 0, right = n - 1;
int top = 0, bottom = n - 1;
for (int k = 0; k <= right; k++)//
{
arr[top][k] = ++sum;
}
最后一列从上到下的代码为
//然后是最后一列从上往下输出
top++;//换为第二行
for (int k = top; k <= bottom; k++)
{
arr[k][right] = ++sum;
}
最后一行从右到左的代码为
//然后是最后一行从右往左输出
right--;
for (int k = right; k >= left; k--)
{
arr[bottom][k] = ++sum;
}
第一列从下到上的代码为
//最后是第一列从下往上输出
bottom--;
for (int k = bottom; k >= top; k--)
{
arr[k][left] = ++sum;
}
(5)当一次循环结束后需要“缩圈”
//然后缩圈
left++;
//之后继续走这个循环,直到输出所有答案
(6)存储所有数之后,进行打印输出
//打印这些数值
for (int i = 0; i < n; i++)//控制行打印
{
for (int j = 0; j < n; j++)//控制列打印
{
if (arr[i][j] < 10)
{
printf(" %d", arr[i][j]);//控制占位3个字符
}
else if (arr[i][j] < 100)
{
printf(" %d", arr[i][j]);//控制占位3个字符
}
else
{
printf("%d", arr[i][j]);
}
}
printf("\n");//加入该换行符后才会看到回字循环
3.代码
#include<stdio.h>
#include<math.h>
int main()
{
int n;//存入回字循环的行和列数
scanf("%d", &n);
int arr[10][10];//创建二维数组存储数字
int left = 0, right = n - 1;
int top = 0, bottom = n - 1;
int sum = 0;//sum用来表示回字循环过程中不断增加的数
while (sum <= n * n)
{
//首先第一行从左向右输出
for (int k = 0; k <= right; k++)
{
arr[top][k] = ++sum;
}
//然后是最后一列从上往下输出
top++;//换为第二行
for (int k = top; k <= bottom; k++)
{
arr[k][right] = ++sum;
}
//然后是最后一行从右往左输出
right--;
for (int k = right; k >= left; k--)
{
arr[bottom][k] = ++sum;
}
//最后是第一列从下往上输出
bottom--;
for (int k = bottom; k >= top; k--)
{
arr[k][left] = ++sum;
}
//然后缩圈
left++;
//之后继续走这个循环,直到输出所有答案
}
//打印这些数值
for (int i = 0; i < n; i++)//控制行打印
{
for (int j = 0; j < n; j++)//控制列打印
{
if (arr[i][j] < 10)
{
printf(" %d", arr[i][j]);//控制占位3个字符
}
else if (arr[i][j] < 100)
{
printf(" %d", arr[i][j]);//控制占位3个字符
}
else
{
printf("%d", arr[i][j]);
}
}
printf("\n");//加入该换行符后才会看到回字循环
}
return 0;
}