题目:输入一个正数n,输出所有和为n连续正数序列。
运行结果:
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。
思路:既然是连续正整数,则可以将其看成是等差数列,公差d=1;
* 等差数列前n项求和公式为Sn=na1+n(n-1)d/2,其中Sn为用户输入的
* 正数,a1为数列起始位置,n为数列长度。将公式变换,n²+(2a1-1)n-2Sn=0;
* 求n,又由公式n=2a分之负b加减根号下b方减4ac,得出根号内为sqt=(2a1-1)²+8Sn;
* 则n=(1-2a1+sqt)/2;
* 本题可令a1从1开始遍历到Sn/2结束,期间若n为正整数,则输出a1...a1+n;
代码如下:
public class findConsecutiveSequence {
/**
* @param PLA
* 和为n连续正数序列
* 题目:输入一个正数n,输出所有和为n连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。
*/
/*既然是连续正整数,则可以将其看成是等差数列,公差d=1;
* 等差数列前n项求和公式为Sn=na1+n(n-1)d/2,其中Sn为用户输入的
* 正数,a1为数列起始位置,n为数列长度。将公式变换,n²+(2a1-1)n-2Sn=0;
* 求n,又由公式n=2a分之负b加减根号下b方减4ac,得出根号内为sqt=(2a1-1)²+8Sn;
* 则n=(1-2a1+sqt)/2;
* 本题可令a1从1开始遍历到Sn/2结束,期间若n为正整数,则输出a1...a1+n;*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum = 15;
getConSeq(sum);
}
private static void getConSeq(int sum) {
// TODO Auto-generated method stub
int sqt = 0, num = 0;
double out_sqt = 0;
for (int i = 1; i <= sum / 2; i++) {
sqt = (2 * i - 1) * (2 * i - 1) + 8 * sum;
out_sqt = Math.sqrt(sqt);
if (out_sqt != (int) out_sqt)
continue;
num = (1 - 2 * i) + (int) out_sqt;
if (num % 2 == 0 && num > 0) {
for (int j = 0; j < num / 2; j++) {
int k = i + j;
System.out.println("seq:" + " " + k);
}
System.out.println("-----------");
}
}
}
}
运行结果:
seq: 1
seq: 2
seq: 3
seq: 4
seq: 5
-----------
seq: 4
seq: 5
seq: 6
-----------
seq: 7
seq: 8
-----------