题目:输入一个正数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 -----------