要哭了要哭了,这个3阶魔方阵后面的三位数字出不来
```c++
#include<stdio.h>
void main()
{
int a[3][3]={0,0,0,0,0,0,0,0,0,},n,k=2,i,j;
scanf("%d",&n);
i=0;j=1;a[0][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if(i<0&&j<n){i=(n-1);}//i=2
else if(i<0&&j==n){i=2;j=0;}
else if(i>=0&&j==n){j=0;}
else;
if(a[i][j]==0) {a[i][j]=k; }
else {i=i+2;j=j-1;a[i][j]=k;}
}
for(i=0;i<n;i++)
{for(j=0;j<n;j++) {printf("%3d",a[i][j]);}
printf("\n");}
}

即数组 a 的第一行没有完全初始化,因为 i=0,j=1,a[0][0]、a[0][2] 这两个位置没有被赋值。这是因为在第一步时,将 i 设为了 -1,导致 a[2][1] 这个位置被赋上了 1,而 a[0][1] 没有被赋值。
解决这个问题很简单,在开始时,将 i 设为 n-1,j 设为 1 即可,即 i=n-1,j=1,a[i][j]=1。这样就能够保证第一行所有位置都被正确初始化了。
修改后的代码如下:
#include<stdio.h>
void main()
{
int a[3][3]={0,0,0,0,0,0,0,0,0,},n,k=2,i,j;
scanf("%d",&n);
i=n-1;j=1;a[i][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if(i<0&&j<n){i=(n-1);}
else if(i<0&&j==n){i=2;j=0;}
else if(i>=0&&j==n){j=0;}
else;
if(a[i][j]==0) {a[i][j]=k; }
else {i=i+2;j=j-1;a[i][j]=k;}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
}
我有个java实现的,稍等我改改给你
如下是 n阶魔方阵,参考
#include<stdio.h>
void main()
{
int N;
scanf("%d", &N);
int arr[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = 0;
}
}
int x = 0, y = N / 2; // 初始位置
for (int i = 1; i <= N * N; i++) {
arr[x][y] = i; // 填充当前位置
// 计算下一个位置
int nx = (x - 1 + N) % N;
int ny = (y + 1) % N;
if (arr[nx][ny] == 0) { // 下一个位置为空
x = nx;
y = ny;
} else { // 下一个位置已被填充
x = (x + 1) % N;
}
}
for (int i1 = 0; i1 < N; i1++) {
for (int j1 = 0; j1 < N; j1++) {
printf("%-3d", arr[i1][j1]);
}
printf("\n");
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:题目描述:
解题思路:
其实在注释里就给出了,无符号char,有8位,且全部是数值位,没有符号位,所以其范围是0~255。
这里能看出什么呢,当我们在使用有符号数的时候要特别注意,尤其是有符号数和无符号数相互转换问题更需要格外小心。
针对问题: 魔方阵显示问题导致无法显示后三位数字,急需帮助 由于缺乏具体的问题描述和代码等信息,我无法提供具体的解决方案。建议您提供更多细节信息,以便更好地帮助解决问题。