leecode | 829连续整数求和

42 篇文章 0 订阅
本文介绍了如何通过数论思想解决求解给定整数n,连续整数和等于n的个数的问题,通过公式推导和举例说明,最后给出一个C++类Solution的实现,利用枚举和约数判断找到符合条件的整数n
摘要由CSDN通过智能技术生成

给一个整数n 求连续整数的和等于n 的个数
这道题 是一个数论的思想

解决思路: 数必须是连续的,可以转化成一个通用的公式,以101为例做一般性推导,: 101 = 101 = 50 + 51 = 24 + 25 + 26 + 27 = 24 * 4 + 6 = a *n + (n - 1)*n/2

归纳出一般性结论: y = a * n + (n - 1) * n / 2 ==> a = y/n - (n - 1) / 2 ==> 猜想:a是整数才能匹配

以y=101为例 a = 101/n - (n - 1) / 2 (n - 1) / 2的小数位为0.5或0,当n > 2时,101/n小数位肯定不为0或者0.5,所以a = 101/n - (n - 1) / 2肯定>不为整数

问题可以转化为求n的值

推演: 示例1: 以15为例 15 = a * n + (n - 1) * n / 2 a = 15/n - (n - 1) / 2

当n=1: a = 15 匹配 15

当n=2: a*2 + 1 = 15 a = 7 匹配 7,8

当n=3: a*3 + 3 = 15 a = 4 匹配 4,5,6

当n=4: a*4 + 6 = 15 a = 9/4 不能除尽 不匹配

当n=5: a*5 + 10 = 15 a = 1 匹配 1,2,3,4,5

a = 1 不大于1,匹配结束, 匹配结果为n=3组

class Solution {
public:
    int consecutiveNumbersSum(int n) {
        //(a, k)
        // (a + a + k - 1)*k/2 = n
        //2a = 2n/k-k+1 ==> 
        //2a = 2n/k -k + 1 >= 2 ==> 2n/k >= k+1 <==> 2n/k > k
        //那么 就在 [1, 2n^1/2) 的范围去枚举 k 
        // 如果k  是2n约数,再结合 (2a+k-1)*k = 2n 就可以验证a合法
        //枚举k 就好, k 必是2n的约数,并且为 较小 的约数
        //经过推论 ,满足上面的不等式  接着两个条件 就把答案挑出来了
        int n *= 2 , ans = 0;
        for(int k = 1; k * k < n; ++k){
            if(n % k != 0){
                continue;
            }
            if((n / k - (k - 1))%2 == 0){
                ans++;
            }
        }
        return ans;
    }
};

// 真的太秀了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值