LeetCode 829. 连续整数求和

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(k1)/2

2 n = k ( k + 2 a − 1 ) 2n = k(k + 2a - 1) 2n=k(k+2a1)
容易看出若有满足条件的ak,则a的值由k决定。由于kk + 2 * a - 1相差一个奇数,只需算出2 * n有多少种分解2 * n = p * q,使得pq的奇偶性不同。将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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值