2016-03-20 167 views
2

我試圖做一段接受「n」輸入的代碼,計算第n行奇數三角形上的數字總和,如下所示:CodeWars - 奇數的總和 - For循環

   1 
      3  5 
     7  9 11 
    13 15 17 19 
21 23 25 27 29 

等,所以對於n = 3,總和將7 + 9 + 1127

我知道是n不僅是行號,但也等於該行號的數目。所以n = 3也有3個奇數。因此,我認爲我可以得到該行的第一個數字,然後循環添加兩個到前一個數字然後求和。

我在下面的代碼不起作用,所以對於n=43的輸入,我的代碼計算出總和爲3570,而它實際上等於79507

public static int rowSumOddNumbers(int n) { 
    int firstNum = (2 * n) - 1; 
    int total = 0; 
    for (int i = 0; i < n; i++) { 
     total += (firstNum + 2); 
    } 
    return total; 
} 

我相信我的問題是,我不是當前號碼+ 2相加在一起之前的數量應該是因爲我需要存儲先前循環的結果不是把它添加到當前循環的結果?

任何幫助表示讚賞。

+0

是什麼讓你爲'firstNum'提出'(2 * n) - 1'?這顯然是錯誤的。 – bcsb1001

回答

8

在n 的第線奇數的總和是簡單地n的立方體:

public static int rowSumOddNumbers(int n) { 
    return n * n * n; 
} 

我把推導給讀者。


順便說一句,你的發言,對n = 43的值應該是74088不正確。它實際上是79507

1

這是有可能更快地等方法also.First你必須找到在第n個line.You第一個數字可以看出,每行的起始號碼在順序如何才能解決這個問題

1 3 7 13 21 ... 

因此第n項將(n-1)^2 + (n-1)+1

一旦你發現,你可以通過在該行從數以迭代的項數找到該行 所有數字的總和

for(int i=0;i<n;i+=2) 
{ 
    sum+=(Nth_Term+i); 
} 

或者簡單適用的AP的正項和的公式與comman比2

sum= n*(2*Nth_Term + (n-1)*2)/2 ; 

而且如果你把第N項的值在上述公式中,你會發現,它的計算結果n^3.

sum = n*(2* ((n-1)^2 + (n-1)+1) + (n-1)*2)/2 = n^3 
0

這就是你要找的。

public class RowSumOddNumbers { 

    public static int array[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; 

    public static int rowSumOddNumbers(int n) { 
     int firstIndex = 0; 
     for (int i = 1; i < n; i++) { 
      firstIndex += i; 
     } 
     int total = 0; 
     for (int i = firstIndex; i < firstIndex + n; i++) { 
      total += array[i]; 
     } 
     return total; 
    } 

    public static void main(String[] args) { 
     System.out.println(RowSumOddNumbers.rowSumOddNumbers(3)); //27 
     System.out.println(RowSumOddNumbers.rowSumOddNumbers(1)); //1 
     System.out.println(RowSumOddNumbers.rowSumOddNumbers(2)); //8 
    } 
}