现在的位置: 首页 > 综合 > 正文

和为n连续正数序列

2017年10月28日 ⁄ 综合 ⁄ 共 1216字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.