LeetCode 829. 连续整数求和
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
供稿: 魏成
问题: 给定一个正整数n,返回连续正整数满足所有数字之和为n的组数。
若有连续正整数a,a + 1,…,a+k-1之和为n,由等差数列的求和公式可知
n=ka+k(k−1)/2 n = ka + k(k - 1) / 2 n=ka+k(k−1)/2
2n=k(k+2a−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=2rt,
n = 2^rt,
n=2rt,
则t的每个因子a都对应上述的一个分解:
2n=(2r+1a)(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)]
306

被折叠的 条评论
为什么被折叠?



