LeetCode 829. 连续整数求和
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
供稿: 魏成
问题: 给定一个正整数n
,返回连续正整数满足所有数字之和为n
的组数。
若有连续正整数a
,a + 1
,…,a+k-1
之和为n
,由等差数列的求和公式可知
n = k a + k ( k − 1 ) / 2 n = ka + k(k - 1) / 2 n=ka+k(k−1)/2
2
n
=
k
(
k
+
2
a
−
1
)
2n = k(k + 2a - 1)
2n=k(k+2a−1)
容易看出若有满足条件的a
和k
,则a
的值由k
决定。由于k
和k + 2 * a - 1
相差一个奇数,只需算出2 * n
有多少种分解2 * n = p * q
,使得p
与q
的奇偶性不同。将n
写成
n
=
2
r
t
,
n = 2^rt,
n=2rt,
则t
的每个因子a
都对应上述的一个分解:
2
n
=
(
2
r
+
1
a
)
(
t
/
a
)
2n = (2^{r + 1}a)(t/a)
2n=(2r+1a)(t/a)
因此只需算出t
的因子的个数:
class Solution {
public:
int consecutiveNumbersSum(int n) {
while ((n & 1) == 0) {
n >>= 1;
}
int ret = 0;
int i = 1;
for (; i * i < n; i++) {
ret += n % i == 0;
}
ret <<= 1;
ret += i * i == n;
return ret;
}
};
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0fAb6N0q-1654477682277)(829_result.jpeg)]