题目:
要求写出这样一个函数,给定一个大于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;
附上草稿:
如果大家有更好的思路可以互相交流下