具有 N 列的二维数组中每一列和每一行的总和

Posted

技术标签:

【中文标题】具有 N 列的二维数组中每一列和每一行的总和【英文标题】:The sum for every column and raw in a 2D array with N columns 【发布时间】:2021-12-04 17:31:31 【问题描述】:

我在 C# 中有一个二维数组,用户输入来填充数组。我需要帮助才能找到每一列和每一行的总和。

var input = Console.ReadLine();
        var n = int.Parse(input);

        int[,] intArr = new int[n, 3];

        for (int i = 0; i < n; i++)
        
            input = Console.ReadLine();
            var parts = input.Split(' ');

            for (int j = 0; j < 3; j++)
            
                intArr[i, j] = int.Parse(parts[j]);
            
        
        if (n == 1)
        
            Console.WriteLine("Sum of column " + Convert.ToString(n) + ": " + (intArr[n - 1, 0] + intArr[n - 1, 1] + intArr[n - 1, 2]));
            Console.WriteLine("Row1: " + (intArr[n - 1, 0]));
            Console.WriteLine("Row2: " + (intArr[n - 1, 1]));
            Console.WriteLine("Row3: " + (intArr[n - 1, 2]));
        
        if (n == 2)
        
            Console.WriteLine("Sum of column " + Convert.ToString(n - 1) + ": " + (intArr[n - 2, 0] + intArr[n - 2, 1] + intArr[n - 2, 2]));
            Console.WriteLine("Sum of column " + Convert.ToString(n) + ": " + (intArr[n - 1, 0] + intArr[n - 1, 1] + intArr[n - 1, 2]));
            Console.WriteLine("Row 1: " + (intArr[n - 2, 0] + intArr[n - 1, 0]));
            Console.WriteLine("Row 2: " + (intArr[n - 2, 1] + intArr[n - 1, 1]));
            Console.WriteLine("Row 3: " + (intArr[n - 1, 2] + intArr[n - 1, 1]));

      
   
User input:
       2
       1 2 3
       4 5 6
       The output:  
       Sum of column 1: 6
       Sum of column 2: 15
       Row 1: 5
       Row 2: 7
       Row 3: 11

我想要用户输入的 N 列的此输出,但我被卡住了! 谢谢!

【问题讨论】:

简单提示:将i替换为j 【参考方案1】:

不确定,您的问题是得到了不想要的结果,还是您的模型具有固定数量的元素?数组是一个固定大小的数据容器,所以如果你想要任意数量的列,那么架构可能就是你想要改变数组的地方。 无论如何,问题 1 是您让用户选择了他们想要的行数,但现在选择了多少列,所以假设您的数据会有 3 个冲突。所以你在数组上有一个 .getUpperBound() ,它接受一个范围参数,这样我们就可以使用动态结构

//From:
for (int i = 0; i < n; i++)

        input = Console.ReadLine();
        var parts = input.Split(' ');

        for (int j = 0; j < 3; j++)
        
            intArr[i, j] = int.Parse(parts[j]);
        
    

//TO:  
var rows = new List<int[]>();      
for (int i = 0; i < n; i++)

    input = Console.ReadLine();
    var parts = input.Split(' ');
    var listOf = new List<int>();                

    for (int j = 0; j < parts.GetUpperBound(0); j++)
        
            listOf.Add(int.Parse(parts[j]));
        
    rows.Add(listOf.ToArray());

来自https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.aggregate?view=net-5.0你获得聚合能力

    [Fact]
    public void SumExerciseTest()
    
    /*
     The output:  
     Sum of column 1: 6
     Sum of column 2: 15
     Row 1: 5
     Row 2: 7
     Row 3: 11 => 9
    */
        var testData = new[]  "1 2 3", "4 5 6" ;

        var input = "2"; // Console.ReadLine();
        var n = int.Parse(input);

        var rows = new List<int[]>(n);

        for (int i = 0; i < n; i++)
        
            input = testData[i];
            var parts = input.Split(' ');

            var listOf = new List<int>();
            for (int j = 0; j <= parts.GetUpperBound(0); j++)
            
                listOf.Add(int.Parse(parts[j]));
            
            rows.Add(listOf.ToArray());
        

        var rowSums = new List<int>(n);
        foreach (int[] row in rows)
        
            rowSums.Add(row.Aggregate((result, item) => result + item));
        

        int maxLength = 0;
        var rowLengths = new List<int>(n);
        foreach (int[] row in rows)
        
            rowLengths.Add(row.Length);
        
        maxLength = rowLengths.Max();

        int[] columnSums = new int[maxLength];
        for (int idx = 0; idx < columnSums.Length; idx++)
            foreach (var row in rows)
            
                if (row.GetUpperBound(0) >= idx)
                
                    columnSums[idx] += row[idx];
                
            
        

        int counter = 0;
        //Outputting:
        foreach(var sum in rowSums)
        
            counter += 1;
            System.Diagnostics.Debug.WriteLine($"Row counter: sum");
        

        counter = 0;
        foreach(var sum in columnSums)
        
            counter += 1;
            System.Diagnostics.Debug.WriteLine($"Column counter: sum");
        

【讨论】:

【参考方案2】:

好吧,让我们实现(提取)对任意列和行求和的方法:

  private static int SumColumn(int[,] array, int column) 
    if (array == null)
      throw new ArgumentNullException(nameof(array));

    if (column < 0 || column >= array.GetLength(1))
      throw new ArgumentOutOfRangeException(nameof(column)); 

    int result = 0;

    for (int r = 0; r < array.GetLength(0); ++r)
      result += array[r, column];

    return result; 
  

  private static int SumRow(int[,] array, int row) 
    if (array == null)
      throw new ArgumentNullException(nameof(array));

    if (row < 0 || row >= array.GetLength(0))
      throw new ArgumentOutOfRangeException(nameof(row)); 

    int result = 0;

    for (int c = 0; c < array.GetLength(1); ++c)
      result += array[row, c];

    return result; 
  

那么你就可以放

  for (int c = 0; c < intArr.GetLength(1); ++c)
    Console.WriteLine($" Sum of column c + 1: SumColumn(intArr, c)"); 

  for (int r = 0; r < intArr.GetLength(0); ++r)
    Console.WriteLine($" Sum of row r + 1: SumRow(intArr, r)");

【讨论】:

以上是关于具有 N 列的二维数组中每一列和每一行的总和的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中,如何生成数组的排列,其中每一列和每一行只有一个元素?

打印 2 个数组的行和列的总和

求大神

C语言中如何取二维数组的一行(一列)?

将二维坐标转换为一维数组

面试题目4:二维数组中的查找