题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路:首先找出这个数字的因数,然后判断是否能找到以这个因子包含在内的那串连续正数序列,若因子为偶数,则可能出现以此因子为中心的连续正数序列,若因子为奇数,则可能出现一串连续正数序列首尾相加都等于此因子,例如9、10、11、12、13、14、15、16首尾相加都为25,共有100/25=4组
ac代码:
1 import java.util.ArrayList; 2 public class Solution { 3 public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { 4 5 6 ArrayList<Integer> list=new ArrayList<Integer>(); 7 for(int i=2;i<=sum;i++){ 8 if(sum%i==0) 9 list.add(i); 10 } 11 System.out.println(list.toString()); 12 ArrayList<Integer> ss; 13 ArrayList<ArrayList<Integer>>list2=new ArrayList<ArrayList<Integer>>(); 14 for(int i=list.size()-1;i>=0;i--){ 15 ss=isRight(sum,list.get(i)); 16 if(ss!=null){ 17 list2.add(ss); 18 } 19 } 20 if(sum==3){ 21 ArrayList<Integer>t=new ArrayList<Integer>(); 22 t.add(1); 23 t.add(2); 24 list2.add(t); 25 } 26 return list2; 27 } 28 ArrayList<Integer> isRight(int sum,int n){ 29 if(n%2==0){ 30 int x=sum/n; 31 if(n-x<0) 32 return null; 33 ArrayList<Integer>list=new ArrayList<Integer>(); 34 int s=0; 35 for(int i=n-x/2;i<=x/2+n;i++){ 36 list.add(i); 37 s+=i; 38 } 39 if(s==sum) 40 return list; 41 return null; 42 }else{ 43 int x=sum/n; 44 int y=n/2; 45 if(y-x<0) 46 return null; 47 ArrayList<Integer>list=new ArrayList<Integer>(); 48 for(int i=y-x+1;i<=y+x;i++){ 49 list.add(i); 50 } 51 return list; 52 } 53 } 54 }