我有一个程序,我必须打印矩阵,例如n = 5(用户可以输入任何正整数n <20),这样:
0 20 19 17 14
1 0 18 16 13
2 5 0 15 12
3 6 8 0 11
4 7 9 10 0
我最初的想法是用零填充主对角线,而不是从1到(n*n-n)/2
用主对角线(i>j)
下的这些元素填充矩阵,并从(n*n-n)/2
填充到矩阵n - 主对角线(i<j)
上方的元素。但是,该程序无法按预期工作。我想问一下为什么会这样。
答案 0 :(得分:0)
除了 i 和 a 的多重声明之外,您的循环会继续为同一个变量指定值。
// changed i to k because of double declaration
for(int k=1; k<(n*n-n)/2; k++)
{
a[i][j]=k;
}
更好的方法是:
int number = 1;
int col = 0, row = 1;
while(col < n && row < n){
for(int pos = row; pos < n; ++pos){
mat[col][pos] = number++;
}
++col;++row;
}
col = n-1;
row = n-2;
while(col >= 0 && row >= 0){
for(int pos = row; pos >= 0; --pos){
mat[col][pos] = number++;
}
--col;--row;
}