js快速求出连续数字之和为指定数字的所有情况

题目:

  要求写出这样一个函数,给定一个大于2的数字r,经过此函数处理之后能够输出所有连续数字和为r的情况。

例如,给定数字15,则最终输出三个组合:[7,8],[4,5,6],[1,2,3,4,5];

先给出我写的代码吧,后面再给出分析:

    function add(r) {
        var resArr = []; //结果数组,存放连续数字的起始数字和结尾数字
        for (var q = 2; 2 * r / q - q >= 1; q++) { //q带表连续数字的个数
            var n = (2 * r / q - q + 1) / 2; //n为起始位置(n+q-1为结束位置)
            n === ~~n && resArr.push([n, n + q - 1]); //如果n为整数则存放此次结果
        }
        return resArr;
    }

 

分析:

首先我们假设在这串连续的数字中:

  起始位置的数字为n;

  总共的数字个数为Q;

那么我们可以得出:

  结束位置的数字为n+Q-1;

我们知道连续数字的和=(起始位置数字+结束位置数字)/2*总的数字个数

因此可得:

  r=(n+n+Q-1)/2*Q;

最终我们可以得到:

  起始位置的数字n=(2r/Q-Q+1)/2;

因为n是大于或等于1的,因此:

  2r/Q-Q>=1;

在以上的分析中:

  数字个数Q是不定的,我们根本不知道,但是我们知道Q最小为2,并且知道2r/Q-Q必须大于或等于1;

因此我们可以将Q可能的所有值进行遍历,从2开始遍历,遍历条件为2r/Q-Q>=1,Q每次自加1;

我们可以在循环当中根据r和Q得出起始位置n和结束位置n+Q-1;

附上草稿:

如果大家有更好的思路可以互相交流下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值