如何从对角线获得数字总和?

时间:2010-09-28 14:59:08

标签: c#

以下是对角线左上角到右下角的总和:

public int sumarDiagonal()
{
    int x = 0;
    for (int F = 0; F < Filas; F++)
    {
        for (int c = 0; c < Columnas; c++)
        {
            if (F == c)
            {
                x += m[F,c];
            }
        }
    }
    return x;
}

如何从右上角到左下角?

5 个答案:

答案 0 :(得分:2)

具有两个嵌套循环的原始代码效率不高。 最好这样做:

public int sumarDiagonal() 
{ 
 int x = 0; 
 for (int i = 0; i < Math.Min(Filas,Columnas); ++i) 
  x += m[i,i]; 
 return x; 
} 

public int sumarAntiDiagonal() 
{ 
 int x = 0; 
 for (int i = 0; i < Math.Min(Filas,Columnas); ++i) 
  x += m[Filas - 1 - i,i]; 
 return x; 
} 

答案 1 :(得分:1)

您实际上不需要查看每个系数:

public int sumarDiagonal()
    {
        int x = 0;
        int length = Math.Min(Filas,Columnas); // Can deal with rectangular cases
        for (int i = 0; i < length; i++)
            x += m[i,length-1-i];
        return x;
    }

答案 2 :(得分:0)

只需反转您的索引,如下所示:

public int sumarDiagonal()
{
   int x = 0;
   for (int F = 0; F < Filas; F++)
   {
      x += m[F,Filas-F-1];
   }
   return x;
}

这假设是一个正方形数组,因此对于10x10,第一个点是[0,9],第二个是[1,8]等。

答案 3 :(得分:0)

如何更换

if (F == c)

if (F + c + 1 == Filas)

编辑:已更新为基于0的阵列

的帐户

答案 4 :(得分:0)

   public int diagX()
        {
            int x;
            x = 0;

        for (f = 1; f <= filas; f++)
          {
           for (c = columnas; c >= 1; c--)
               {
                   if (f > c || f < c)
                   {
                       x += a[f, c];
                   }
                   else
                   {
                       continue;
                   }
                }
          }
        return x;
        }

例如这段代码: 如果你有 1,2 3,6 而你想穿过诊断你必须拿[2,1]你会得到2。 并且在循环时你会继续使用其他因为得到值2之后。 它将是[2,2],因为f == c为false然后你不会回到第一个循环。为什么f == c是假的,因为如果你想跨矩阵的diag搜索你不能从f == c得到价值。例如: 如果上面的矩阵我们循环但可以等于f和c。我们可以得到: (a [2,1] = 2)+(a [2,2] = 6)= 8 nah!你可以在这段代码中看到很大的错误。