Java中前N個能被3整除的偶數和
1.概述
在本教程中,我們將探索使用 Java 計算前 N 個可被 3 整除的偶數總和。這可以使用不同的方法來解決。
我們將研究兩種不同的方法來說明這些方法。第一種方法是暴力法。此方法涉及逐步方法,我們討論每個偶數並確定其能否被 3 整除N
我們要討論的第二種方法是最佳化數學方法。此方法利用偶數可被3整除的固有性質,推導出直接計算的公式。這種方法可以顯著提高效能,尤其是在處理大型數位資料集時。
2. 暴力法
蠻力方法涉及迭代數字,識別那些偶數且可被 3 整除的數字,並將它們加到運行總數中。這是一種簡單的方法,但可能效率較低,因為它單獨檢查每個偶數,而不是直接關注6 的倍數。的最小公倍數) 2 和 3),專注於 6 的倍數可以讓我們跳過對不滿足這兩個條件的數字的不必要的檢查。
2.1.使用for
循環實現
對於我們的程式碼範例,我們將NUMBER
定義為 7,它表示前 7 個偶數,將EXPECTED_SUM
定義為 18 (6 + 12),這是此計算的預期結果:
static final int NUMBER = 7;
static final int EXPECTED_SUM = 18;
在下一個範例中,我們將使用for
迴圈來實現結果:
@Test
void givenN_whenUsingBruteForceForLoop_thenReturnsCorrectSum() {
int sum = 0;
for (int i = 2; i <= NUMBER * 2; i++) {
if (i % 2 == 0 && i % 3 == 0) {
sum += i;
}
}
assertEquals(EXPECTED_SUM, sum);
}
在這裡,我們檢查從 2 開始的每個偶數,循環繼續,直到我們找到可同時被 2 和 3 整除的前N
N
O(N)
N
數字。在本例中,我們檢查許多不能被 2 和 3 整除的數字。
2.2.函數式程式設計方法
我們可以利用 Java 的函數式程式設計特性來實現更現代的方法。使用Stream
API,我們可以產生無限的數字Stream
,**然後過濾該Stream
以僅包含偶數,將其限制為前N
個偶數,最後過濾那些可被 3 整除的數字,然後再求和。**這種函數式風格可以更加簡潔和聲明性:
@Test
void givenN_whenUsingFunctionalApproach_thenReturnsCorrectSum() {
int sum = IntStream.iterate(2, i -> i + 1)
.filter(i -> i % 2 == 0)
.limit(NUMBER)
.filter(i -> i % 3 == 0)
.sum();
assertEquals(EXPECTED_SUM, sum);
}
此實作使用IntStream.iterate()
產生從 2 開始的無限Integers
Stream
。
2.3.改進的蠻力法
透過觀察可被 3 整除的偶數也可被 6 整除,可以進一步改進暴力法。 ,使該方法更有效率:
@Test
void givenN_whenUsingImprovedBruteForce_thenReturnsCorrectSum() {
int sum = IntStream.iterate(6, i -> i + 6)
.limit(NUMBER / 3)
.sum();
assertEquals(EXPECTED_SUM, sum);
}
透過直接迭代6的倍數,我們提高了暴力法的性能,使其在不改變其核心結構的情況下更有效率。這種最佳化使得演算法在實務上更快,但總體時間複雜度保持線性,因為迭代次數與N
成正比。
3. 最佳化數學方法
在暴力方法中,我們迭代數字並檢查每個數字是否能被 6 整除,以找到能被 3 整除的偶數。 6. 因此,我們可以直接計算 6 的前N/3
倍數並對其求和,而不是迭代數字並檢查整除條件。這是因為,每三個偶數中,只有一個能被3整除,所以前N
能被3整除的偶數是6的前N/3
倍數。
3.1.數學洞察力
每個能被 3 整除的偶數都是 6 的倍數。
我們可以直接計算 6 的前 N 個倍數並對其求和,而不是迭代數字。
6 的前
N
倍數分別是 6 * 1, 6 * 2, 6 * 3, …, 6 * N。Sum = 6 * (1 + 2 + 3 + ⋯ + N)
前
N
自然數的和由以下公式給出:(N * (N + 1)) / 2
使用此公式, 6 的前
N/3
倍數總和可計算為:Sum = 6 * (N / 3 * (N / 3 + 1)) / 2 = 3 * (N / 3) * (N / 3 + 1)
這種方法完全避免了循環,使其比暴力方法更有效,特別是對於較大的N.
值。
3.2.最佳化的數學程式碼
我們直接使用6的前N / 3
倍數總和的公式來計算總和:
@Test
void givenN_whenUsingOptimizedMethod_thenReturnsCorrectSum() {
int sum = 3 * (NUMBER / 3) * (NUMBER / 3 + 1);
assertEquals(EXPECTED_SUM, sum);
}
這種方法要快得多,因為它完全避免了循環並將問題簡化為簡單的算術計算。此方法的時間複雜度為O(1)
,因為無論N.
的值為何,它都會執行恆定數量的操作。
4. 比較兩種方法
蠻力方法和最佳化數學方法的主要區別在於效能、簡單性和靈活性。
就時間複雜度而言,暴力方法的複雜度為O(N)
,因為它們需要迭代數字。即使改進的蠻力方法雖然更有效,但仍然依賴循環。另一方面,最佳化的數學方法使用直接公式,使其具有恆定的時間複雜度O(1)
,使其速度明顯更快,尤其是對於較大的N
。
就簡單性而言,蠻力方法很簡單,但涉及循環和條件,這使得它們稍微更長且更複雜。優化後的方法更乾淨、更簡潔,因為它直接套用公式。然而,它需要對數學原理有一定的熟悉。
就靈活性而言,蠻力方法的適應性更強。如果問題發生變化,例如對可被不同數字整除的數字求和,則可以輕鬆調整這些方法。然而,最佳化方法專門針對 6 的倍數,並且需要針對不同條件的新公式。
下表簡要總結了主要差異:
暴力破解 | 改進的蠻力 | 最佳化數學 | |
---|---|---|---|
時間複雜度 | 在) | 在) | 複雜度(1) |
空間複雜度 | 複雜度(1) | 複雜度(1) | 複雜度(1) |
簡單 | 簡單,基於循環 | 更有效率的循環 | 非常簡潔,使用公式 |
靈活性 | 適應不同條件 | 適應不同條件 | 適應性較差,配方特定 |
5. 結論
在本文中,我們探討了計算前N
可被 3 整除的偶數總和的兩種主要方法:強力方法和最佳化數學方法。蠻力方法雖然適應性強,但涉及以 O(N) 複雜度迭代數字。同時,優化後的方法採用常數時間O(1)的直接公式,效率較高,但彈性較差。
與往常一樣,原始碼可以在 GitHub 上取得。