2013-05-21 83 views
0

我有一個隨機元素的一維數組,通過一個m * n網格。我想找出列中的總數和列總數。查找數組中的列總數

這裏是1個維陣列是如何: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 ,19,20]

我要像對待:

0102030405

0607080910

1112131415

1617181920

現在我想找到的總選舉事務處和列總。

for (int i = 0; i < totalRows; i++) 
     { 
      for (int j = 0; j < totalColumns; j++) 
      { 
       rowTotal[i] += numbers[temp + j]; 
      }    
      temp += totalColumns; 
     } 

我試圖做同樣的色譜柱: 行總計按如下規則進行。 下面是代碼:

for (int i = 0; i < totalColumns; i++) 
     { 
      tempk = 0; 

      for (int j = 0; j < totalRows; j++) 
      { 
       blockTotal[i] += numbers[i+j+tempk]; 
       tempk += totalColumns; 

      } 
     } 

我不能夠得到列總數,按預期。請幫忙。

+0

爲什麼不是使用多維數組而是使用多維數組? –

+0

你應該可以通過使用第一個循環來獲得結果,並用'columnTotal [j] + ='替換'rowTotal [i] + ='。 – didierc

回答

3

您既可以在同一迴路得到

for (int i = 0; i < totalRows; i++) 
{ 
    for (int j = 0; j < totalColumns; j++) 
    { 
     rowTotal[i] += numbers[i * totalColumns + j]; 
     blockTotal[j] += numbers[i * totalColumns + j]; 
    }    
} 
+0

此代碼僅適用於M * M矩陣。不適用於M * N。我如何修改此代碼,以便使其對M * N有效? – Vivek

0

總按行

for(int r = 0; r < totalRows; r++) 
{ 
    for(int c = 0; c < totalColumns; c++) 
    { 
    rowTotal[r] += numbers[r * totalColumns + c]; 
    } 
} 

總被列

for(int c = 0; c < totalColumns; c++) 
{ 
    for(int r = 0; r < totalRows; r++) 
    { 
    colTotal[c] += numbers[r * totalColumns + c]; 
    } 
} 
+0

這應該是'R * totalColumns + C',不'R * totalColumns + totalColumns' – juharr

+0

是我的錯,感謝您的建議 –

+0

此代碼的工作只爲M * M的矩陣。不適用於M * N。我如何修改此代碼,以便使其對M * N有效? – Vivek

1

做最簡單的事情是寫一個翻譯「邏輯」(行,列)地址索引的小方法:

int numberAt(int row, int col) 
{ 
    return numbers[row * totalColumns + col]; 
} 

int[] colTotals = new int[totalColumns]; 
int[] rowTotals = new int[totalRows]; 

for (int row = 0; row < totalRows; ++row) 
{ 
    for (int col = 0; col < totalColumns; ++col) 
    { 
     int number = numberAt(row, col); 
     rowTotals[row] += number; 
     colTotals[col] += number; 
    } 
} 

編輯響應在下面的評論質疑:

以下是一個演示它的工作非正方形陣列上的完整的編譯例子:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Demo 
{ 
    class Program 
    { 
     // Array will 4x3 (rows x cols): 
     // 
     // 1 2 3 | 6 
     // 4 5 6 | 15 
     // 7 8 9 | 24 
     // 10 11 12 | 33 
     // --------- 
     // 22 26 30 

     int[] numbers = Enumerable.Range(1, 12).ToArray(); 
     int totalColumns = 3; 
     int totalRows = 4; 

     int numberAt(int row, int col) 
     { 
      return numbers[row * totalColumns + col]; 
     } 

     void test() 
     { 
      int[] colTotals = new int[totalColumns]; 
      int[] rowTotals = new int[totalRows]; 

      for (int row = 0; row < totalRows; ++row) 
      { 
       for (int col = 0; col < totalColumns; ++col) 
       { 
        int number = numberAt(row, col); 
        rowTotals[row] += number; 
        colTotals[col] += number; 
       } 
      } 

      Console.WriteLine("Row totals"); 

      foreach (int rowTotal in rowTotals) 
       Console.Write(rowTotal + " "); 

      Console.WriteLine("\nCol totals"); 

      foreach (int colTotal in colTotals) 
       Console.Write(colTotal + " "); 

      Console.WriteLine(); 
     } 

     static void Main() 
     { 
      new Program().test(); 
     } 
    } 
} 
+0

此代碼僅適用於M * M矩陣。不適用於M * N。我如何修改此代碼,以便使其對M * N有效? – Vivek

+0

@Vivek它*確實*爲M * N工作 - 我已經添加了示例代碼到我的答案來演示。 –