对角线问题:在一个 n * n ,的二维数组里。只把主对角线 [左上右下] , 赋值为 x,其余全部赋值为 y 。
您 ?️ 来画一个,要是美观,我便换。
那么,按照题意。
// 方法一,逐个扫描赋值
const int n = 8;
int a[n][n];
int main(void){
int x = 9;
int y = 5;
for( size_t i = 0; i < n; i ++ )
{
for( size_t j = 0; j < n; j ++ )
{
if( i == j ) // 主对角线 , 下标 i,j 相等
a[i][j] = x;
else
a[i][j] = y;
}
}
return 0;
}
一位优秀的计算机科学家或工程师与平庸的程序员最大差别在于:前者总是不断寻找并且有能力找到好的算法,而后者仅常常满足于勉强解决问题。如果我们想,成为前者,我们就继续思考了,试着优化。
3 min...
-----------------------------------------------------------------------------------------------------------
提示:可以不用逐个扫描判断。
// 方法二,全部赋值为 y 后,满足条件 i == j , 再赋值 x
const int n = 8;
int b[n][n];
int main(void){
int x = 9;
int y = 5;
for( size_t i = 0; i < n; i ++ )
{
for( size_t j = 0; j < n; j ++ )
{
b[i][j] = y; // 减少了 n*n 次判断
}
}
for( size_t k = 0; k < n; k ++ ) // 一个for循环就可以搞定
b[i][i] = x;
return 0;
}
一位优秀的计算机科学家或工程师与平庸的程序员最大差别在于:前者总是不断寻找并且有能力找到好的算法,而后者仅常常满足于勉强解决问题。如果我们想,成为前者,我们继续思考,试着优化。
3 min...
// 方法三,改进后来的循环额外赋值
const int n = 8;
int b[n][n];
int main(void){
int x = 9;
int y = 5;
for( size_t i = 0; i < n; i ++ )
{
for( size_t j = 0; j < n; j ++ )
{
b[i][j] = y; // 减少了 n*n 次判断
}
b[i][i] = x; // 减少了 n 次
}
return 0;
}
-----------------------------------------------------------------------------------------------------------
// 方法四,发现方法三会有重复的赋值主对角线被赋值俩次 ,采用循环展开
const int n = 8;
int c[n][n];
int main(void){
int x = 9;
int y = 5;
for( size_t i = 0; i < n; i ++ ) // 集中在 i 这个循环,循环展开。
{
for( size_t j = 0; j < i; j ++ ) // 前半段赋值,对角线左边
{
c[i][j] = y;
}
c[i][i] = x;
for( size_t j = i+1; j < n; j ++ ) // 后半段赋值,对角线右边
{
c[i][j] = y;
}
}
// 理论上,取消了循环和重复的赋值,内存局部性得到一定的应用。
return 0;
}
一位优秀的计算机科学家或工程师与平庸的程序员最大差别在于:前者总是不断寻找并且有能力找到好的算法,而后者仅常常满足于勉强解决问题。如果我们想,成为前者,我们继续思考,优化。
3 min...
-----------------------------------------------------------------------------------------------------------
那么,您有什么好想法?吗 ??