簡體   English   中英

給定數字是否可以寫成兩個或多個連續正整數的總和?

[英]Can a given number be written as a sum of two or more consecutive positive integers?

我需要編寫一個接受int的方法,如果數字可以寫成兩個或多個連續正整數的總和,則返回true否則返回false

boolean IsSumOfConsecutiveInts(int num)

我發現所有奇數(除了數字1)都可以寫成2個連續正整數的總和:

return (num > 1 && num % 2 == 1);

但是這並沒有考慮到可以寫成超過2個連續正整數之和的數字(例如6 == 1 + 2 + 3 )。

如何確定一個數字是否可以寫成兩個或多個連續正整數的總和?

這些數字稱為禮貌數字

而且,方便的是,唯一不禮貌的數字 2的權力。

所以,這給了我們2個選擇。 我們可以確定一個數字是禮貌的 ,或者我們可以確定它不是2的冪

我做了兩件事; 后者更容易(也更有效)。

  1. 這決定了一個數字是否有禮貌

     boolean IsSumOfConsecutiveInts(int num) { int sumOfFirstIIntegers = 3; for (int i = 2; sumOfFirstIIntegers <= num; i++) { if (i%2 == 0 ? (num%i == i/2) : (num%i == 0)) { return true; } sumOfFirstIIntegers += i + 1; } return false; } 

    這個很難理解。 我花了一段時間才提出來。

    基本上, i是我們正在檢查的連續整數的數量;

    sumOfFirstIIntegers等於前i整數的總和,因此這意味着所有可以表示為i個連續整數之和的數字大於或等於sumOfFirstIIntegers

    值得討論的最后一部分是布爾語句i%2 == 0 ? (num%i == i/2) : (num%i == 0) i%2 == 0 ? (num%i == i/2) : (num%i == 0) 我們來看一些例子:

     i all sums of i consecutive positive integers 2 3, 5, 7, 9... 3 6, 9, 12, 15... 4 10, 14, 18, 22... 5 15, 20, 25, 30... 

    有兩種情況,但在任何一種情況下,我們都可以非常簡單地表達所有可能的數字,它們是i個連續整數的總和。

    1. i是偶數時, num必須等於(i * n) + (i / 2) ,其中n是非負整數。 這當然可以寫成num % i == i / 2

    2. i為奇數時, num必須等於i * n ,其中n是非負整數。 這給了我們第二個條件num % i == 0

    除了這些條件之外, num不能小於前i正整數的總和。 因此,我們的for循環有條件: sumOfFirstIIntegers <= num

  2. 這確定一個數字是否不是2的冪

     boolean IsSumOfConsecutiveInts(int num) { return (num & (num - 1)) != 0; } 

    這個答案很好地解釋了為什么這有效。

請注意,上述兩種解決方案都具有相同的結果,它們只是思考問題的不同方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM