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

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

 

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

相关文章:

  • 2022-12-23
  • 2021-07-07
  • 2022-12-23
  • 2021-06-22
  • 2021-12-14
  • 2021-08-16
猜你喜欢
  • 2021-11-22
  • 2021-11-11
  • 2022-12-23
  • 2021-09-13
  • 2021-12-02
  • 2022-12-23
  • 2022-02-17
相关资源
相似解决方案