//和为S的连续正数序列
import java.util.ArrayList;
/**
* 题解
* 利用求和公式
* (1+n)*n/2
* 计算从1开始,目标sum可以容纳多少个数值相加
* 当从1开始计算可容纳数值的时候,若想添加多一个数都是不容许的,只能减去
*/
public class HeWei_S_DeXianXuZhengShuXuLie {
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
// 使用求和公式
// (1+n)*n/2
int n = (int)Math.sqrt(sum*2);
while(n>1){
// System.out.println("n"+n);
// 首项和末项之和
double addCount = sum*2 /n;
// System.out.println("addcount"+addCount);
// 判断除数是否为整数
if(addCount != (int)addCount){
continue;
}
ArrayList<Integer> list=null;
if(n%2==0){
// n是奇数
// 判断相加值是否为sum
if(count(sum,(int)(addCount/2+0.5)-n/2,n))
// 进行添加
list = add((int)(addCount/2+0.5)-n/2,n);
}else {
if(count(sum,(int)addCount/2-n/2,n))
list = add((int)addCount/2-n/2,n);
}
if(list!=null)
lists.add(list);
n--;
}
for(ArrayList<Integer> lists :lists){
for(Integer l:lists){
System.out.print(l+" ");
}
System.out.println();
}
return lists;
}
public ArrayList<Integer> add(int start,int k){
ArrayList<Integer> arrayList = new ArrayList<>();
for(int i=start;i<start+k;i++){
arrayList.add(i);
}
return arrayList;
}
public boolean count(int sum,int start,int k){
// System.out.println("start"+start);
int count=0;
for(int i=start;i<start+k;i++){
count +=i;
}
if(count==sum)
return true;
return false;
}
}
和为S的连续正数序列
最新推荐文章于 2022-05-05 11:05:49 发布