对角线问题:在一个 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...

-----------------------------------------------------------------------------------------------------------

 

那么,您有什么好想法?吗 ??