for(int k=c;k>0;k--)中k>0条件不对,应维护左边填过的列,而非每次都填到k==1;修改如下:
```cpp
#include <cstdio>
int main()
{
int m,n,num,c,q,l;
int j=1;
int a[10][10];
num=1;
n=1;
scanf("%d",&m);
c=m;
l=0;
while(num<=(m*m))
{for(int i=n;i<=c;i++)
{
a[n][i]=num;
num++;
}
n++;
for(int j=n;j<=c;j++)
{
a[j][c]=num;
num++;
}
q=c;
c--;
for(int k=c;k>l;k--)
{
a[q][k]=num;
num++;
}
for(int p=c;p>=n;p--)
{
a[p][n-1]=num;
num++;
}
l++;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]<10)
printf(" %d",a[i][j]);
else
printf(" %d",a[i][j]);
}printf("\n");
}
return 0;
}
```
by Zero251 @ 2023-12-04 17:40:55