/**
*输出所有和为s的连续正数序列,而且至少含有两个数
*序列内按照从小到大的顺序
*序列间按照开始数字从小到大的顺序
*
*/
/**
* 题目求的是连续正数序列,而且至少含有两个数,那么我们可以从1,2这两个数开始,
* 以求和为9的所有连续序列为例,假设两个指针pSmall和pBig,分别指向正数序列的首尾,pSum表示序列之和,
* 一开始pSmall=1,pBig=2,pSum=3<9,序列需要包含更多的数,于是pBig+1,此时pSum=6,依旧小于9,
* 于是pBig+1, 此时pSum=10,大于9,序列需要删除一些数,于是pSmall-1,pSum=9,找到第一个满足条件的序列;
* 接着pBig+1,按照前面的方法继续查找满足条件的序列,直到pSmall等于(s+1)/2.
*
*求和时可以直接使用等差数列求和公式(公差为1):Sn=(a1+an)*n/2,其中n=an-a1+1.
* */
public class sequence_sum {
public ArrayList<ArrayList<Integer>> sum_list(int s){
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = null;
int psmall=1;
int pbig=2;
while(psmall<=s/2) {
// int psum=sum(psmall,pbig);
int psum=(psmall+pbig)*(pbig-psmall+1)/2;
if(psum==s) {
list = new ArrayList<Integer>();
for (int i = psmall; i <= pbig; i++) {
list.add(i);
}
lists.add(list);
psmall++;
pbig++;
}else if (psum<s) {
pbig++;
}else {
psmall++;
}
}
return lists;
}
// public int sum(int small,int big) {
// int sum=0;
// for(int i=small;i<=big;i++) {
// sum += i;
// }
// return sum;
// }
}