对角线问题:在一个 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...
-----------------------------------------------------------------------------------------------------------
那么,您有什么好想法????吗 ??