您的位置:首页 > 其它

和为S的连续正数序列

2017-08-14 20:59 387 查看
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

import java.util.ArrayList;

public class 和为S的连续正数数列 {

public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<ArrayList<Integer>> answer = new ArrayList<>();
answer = FindContinuousSequence2(11);
for (int i = 0; i < answer.size(); i++) {
ArrayList<Integer> list = new ArrayList<>();
list = answer.get(i);
for (int j = 0; j < list.size(); j++) {
System.out.print(list.get(j)+" ");
}
System.out.println();
}
}

/* 思路一: 答案是错的 思路可以借鉴
* 不过在开方的时候 数据会有很多不一样的地方所以 实际用起来很难。只有看能不能转换成加减乘的算法
* (start+end)*(end-start+1)/2=sum
* start范围从start-->sum/2
* end的方程为end^2+end-(start^2-start+2*sum)
* */
public static ArrayList<ArrayList<Integer>> FindContinuousSequence2(int sum) {
ArrayList<ArrayList<Integer>> answer = new ArrayList<>();
if (sum<3) {
return answer;
}
int c = 0;//判别式b^2-4ac;
int s2 = 0;
for (int i = 1; i <= sum/2; i++) {
c = (int) (Math.pow(i, 2)-i+2*sum);
if (4*c>-1){//判别式>0有根;
s2 = ((int) Math.sqrt(4*c+1)-1)/2;
if (s2>i) {
ArrayList<Integer> list = new ArrayList<>();
for (int j = i; j <= s2; j++) {
list.add(j);
}
answer.add(list);
}
}else {
continue;
}
}
return answer;
}

public static ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> answer = new ArrayList<>();
if (sum<3) {
return answer;
}
int start = 1;
int end = 2;
int lastsum = 3;
int temp = 3;//储存当前序列的和
while(start<=(sum/2)&&end<=(sum+1)/2&&start<end){
while (temp!=sum&&(start<end)) {
if (temp<sum) {
end++;
temp = lastsum + end;
lastsum = temp;
}else if (temp>sum) {
temp = lastsum - start;
lastsum = temp;
start++;
}
}
if (temp==sum) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = start; i <= end; i++) {
list.add(i);
}
answer.add(list);
end++;
temp = lastsum + end;
lastsum = temp;
}
}
return answer;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: