1.输出所有和为s的连续正数序列,而且至少含有两个数

/**
 *输出所有和为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; 
//	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值