这个幻方代码的问题我已经有一段时间了。我一直在逐步遵循一本书的算法,但由于某些原因,它无法正确显示。
int main(){
int n;
char temp[100];
cout << "Enter an odd number: ";
cin >> temp;
n = atoi(temp);
cout << endl;
//error if its even
if (n%2 == 0){
cout << "Input Error!";
return (-1);
cout << endl;
}
int square[n][n];
//places 0 inside
for (int r = 0; r < n; r++){
for (int c = 0; c < n; c++){
square[r][c] = 0;
}
}
//store 1 in middle of first row
square[0][(n-1)/2] = 1;
//current position
int key = 2, i = 0, j = (n-1)/2;
while(key <= n*n){
int k = (i-1)%n, l = (j-1)%n; //look up and left
//square occupied, move down
if (square[k][l] != 0){
i = (i+1)%n;
}
//square (k,l) needs to be assigned
else{
i = k;
j = l;
}
square[i][j] = key; //assign it a value
key++;
}
//display
for (int r = 0; r < n; r++){
for (int c = 0; c < n; c++){
cout << setw(5) << square[r][c] << setw(5);
}
cout << endl;
}
return 0;
}
如果我输入 5 作为奇数,显示会是这样的:
Enter an odd number: 5
5 14 22 20 18
6 15 23 0 19
17 16 24 0 0
0 0 25 0 0
0 0 0 0 0
我期望的输出是:
Enter an odd number: 5
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
似乎是什么问题?
最佳答案
我运行了你的代码,结果如下
Enter an odd number: 5
5 3 1 10 23
6 4 2 11 24
7 16 14 12 25
18 17 15 13 21
19 0 0 0 0
我想这是编译器之间的一些差异。您的问题可能是负数的模也是负数:link
用负值索引是未定义的行为:link
关于c++ - Generating 'Magic Square' Algorithm(算法来自一本书),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772687/