C# 求多维数组的和';s逆对角元素

C# 求多维数组的和';s逆对角元素,c#,C#,这是我的多维数组 1-2-3-4 5-6-7-8 9-10-11-12 13-14-15-16 我要求逆对角线元素的和(从:右上到:左下)(4->7->10->13) 这是我的代码,它给出了一个错误,但我仍然找不到原因 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace sketchboard {

这是我的多维数组

1-2-3-4

5-6-7-8

9-10-11-12

13-14-15-16

我要求逆对角线元素的和(从:右上到:左下)(4->7->10->13)

这是我的代码,它给出了一个错误,但我仍然找不到原因

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sketchboard
{
    class Program
    {

        static int reversediagonaladder (int[,] a)
        {
            int sum = 0;

            for(int row=a.GetLength(0) ; row>0 ;  row--)
            {
                for(int column=a.GetLength(1) ; column>0 ; column--)
                {
                    if (row == column)
                        sum += a[row , column];
                }

            } 


            Console.WriteLine($"{sum}");
            return sum;
        }

        static void Main(string[] args)
        {

            int[,] a ={ {1,2,3,4},
                        {5,6,7,8},
                        {9,10,11,12},
                        {13,14,15,16 } };

            reversediagonaladder(a);

           


            Console.ReadLine(); // added for hold console on screen
        }
    }
}


您的循环以
a.GetLength(1)
a.GetLength(0)
开始。在这两种情况下,这将解析为
4
,但没有
4
的索引,因为索引以
0
开始

因此,索引将是
0、1、2或3
,其长度等于
4

要解决问题,需要从长度中减去
1

目前您也在跳过索引
0
,我不知道您为什么这样做,可能这也是一个错误,要解决这个问题,您必须将
for
循环的中断条件从
>0
更改为
=0

这应该行得通

for (int row = a.GetLength(0) - 1; row >= 0; row--)
{
    for (int column = a.GetLength(1) - 1; column >= 0; column--)
    {
        if (row == column)
            sum += a[row , column];
    }
}
编辑:

这是一个实际实现了问题所声称的功能的版本,它还消除了double for循环,该循环应该运行得更好

var column = a.GetLength(1);
for (int row = 0; row < a.GetLength(0); row++)
{
    column--;
    var item = a[row, column];
    sum += item;
}
var column=a.GetLength(1);
for(int row=0;row
在这里,您可以看到它的作用:


您的循环以
a.GetLength(1)
a.GetLength(0)
开始。在这两种情况下,这将解析为
4
,但没有
4
的索引,因为索引以
0
开始

因此,索引将是
0、1、2或3
,其长度等于
4

要解决问题,需要从长度中减去
1

目前您也在跳过索引
0
,我不知道您为什么这样做,可能这也是一个错误,要解决这个问题,您必须将
for
循环的中断条件从
>0
更改为
=0

这应该行得通

for (int row = a.GetLength(0) - 1; row >= 0; row--)
{
    for (int column = a.GetLength(1) - 1; column >= 0; column--)
    {
        if (row == column)
            sum += a[row , column];
    }
}
编辑:

这是一个实际实现了问题所声称的功能的版本,它还消除了double for循环,该循环应该运行得更好

var column = a.GetLength(1);
for (int row = 0; row < a.GetLength(0); row++)
{
    column--;
    var item = a[row, column];
    sum += item;
}
var column=a.GetLength(1);
for(int row=0;row
在这里,您可以看到它的作用:


如果您不想处理
-1
,请改用

下面是一个示例,按照自己的建议,只使用一个
for
循环:

public static void Main(string[] args)
{
    int[,] a ={ {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16} };

    int sum = reversediagonaladder(a);
    Console.WriteLine("sum = " + sum);

    Console.WriteLine();
    Console.WriteLine("Press Enter to Quit");
    Console.ReadLine();
}

static int reversediagonaladder(int[,] a)
{
    // code assumes a SQUARE matrix
    int sum = 0;
    for (int row=0, col=a.GetUpperBound(1); row<=a.GetUpperBound(0) && col>=0; row++, col--)
    {
        sum += a[row, col];
    }
    return sum;
}
publicstaticvoidmain(字符串[]args)
{
int[,]a={{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16} };
int sum=反向反梯度(a);
Console.WriteLine(“sum=”+sum);
Console.WriteLine();
Console.WriteLine(“按Enter键退出”);
Console.ReadLine();
}
静态int反转dAgonAladder(int[,]a)
{
//代码假定为一个方阵
整数和=0;
for(int row=0,col=a.GetUpperBound(1);row=0;row++,col--)
{
总和+=a[行,列];
}
回报金额;
}

如果您不想处理
-1
,请改用

下面是一个示例,按照自己的建议,只使用一个
for
循环:

public static void Main(string[] args)
{
    int[,] a ={ {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16} };

    int sum = reversediagonaladder(a);
    Console.WriteLine("sum = " + sum);

    Console.WriteLine();
    Console.WriteLine("Press Enter to Quit");
    Console.ReadLine();
}

static int reversediagonaladder(int[,] a)
{
    // code assumes a SQUARE matrix
    int sum = 0;
    for (int row=0, col=a.GetUpperBound(1); row<=a.GetUpperBound(0) && col>=0; row++, col--)
    {
        sum += a[row, col];
    }
    return sum;
}
publicstaticvoidmain(字符串[]args)
{
int[,]a={{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16} };
int sum=反向反梯度(a);
Console.WriteLine(“sum=”+sum);
Console.WriteLine();
Console.WriteLine(“按Enter键退出”);
Console.ReadLine();
}
静态int反转dAgonAladder(int[,]a)
{
//代码假定为一个方阵
整数和=0;
for(int row=0,col=a.GetUpperBound(1);row=0;row++,col--)
{
总和+=a[行,列];
}
回报金额;
}

使用调试器并逐步完成代码。提示:请记住数组索引从0开始。使用调试器并逐步完成代码。提示:请记住数组索引从0开始。问题是“从右上到左下”。。您实际上是从右下到左上。@Goodies-不必费心检查代码是否符合OP的要求,只是修复了我发现的错误。您关于数组边界的评论是正确的。唯一的问题是。。它不能工作。它不会像伯克指定的那样运行4->7->10->13。它将改为16-11-6-1。@Goodies-更新了应答错误,当我把@RandRandom的更正放进去时,错误消失了,但我仍然找不到算法不起作用的原因。.问题是“从右上到左下”。。您实际上是从右下到左上。@Goodies-不必费心检查代码是否符合OP的要求,只是修复了我发现的错误。您关于数组边界的评论是正确的。唯一的问题是。。它不能工作。它不会像伯克指定的那样运行4->7->10->13。改为16-11-6-1。@Goodies-更新了应答错误,当我把@RandRandom的更正放进去时,错误消失了,但我仍然找不到算法不起作用的原因。
//代码假设一个方阵
不知道如果没有方阵,对角线是如何工作的。@RandRandom;例如,当任意一个维度结束时,它都是对角的,并在矩形数组中通过时停止。该注释的真正目的是提请注意,我没有进行任何检查以确保数组实际上是正方形。
//code假设一个正方形矩阵
不知道没有正方形矩阵对角线是如何工作的。@RandRandom;例如,当任意一个维度结束时,它都是对角的,并在矩形数组中通过时停止。这条评论的真正目的是让大家注意,我没有做任何检查来确保数组实际上是正方形的。