|
题目描述:随便给出一个正整数, 求出这个数是由哪几个正整数相加,要求相加的这几个数是连续的。
如: 7+8=15,4+5+6=15,1+2+3+4+5=15
Test.java:
package com.joe;
public class Test { public static void main(String[] args) { int v = 2; do { v++; Test.F(v, 1); } while (v <= 100); } //给出正整数v, 求出它是哪几个连数相加的结果(连数:如2,3,4或4,5) public static void F(int value, int base) { Node node = new Node(); int halfValue = value / 2; boolean flag = false; if(base <= halfValue) { int sum = 0; int i = base; while(true) { sum += i; if(sum == value) //找到一个这样的组合 { node.start = base; node.end = i; node.Display(value); flag = true; //针对当前的value,找到至少一个这样的组合 } if(sum >= value) //寻找下一个组合 { sum = 0; base++; //修改开始位置 if(base <= halfValue) i = base; else //已经不可能再有组合了 break; } else i++; } if(flag) System.out.println(); } } }
Node.java:
package com.joe;
public class Node { public int start; public int end; public void Display(int v) { System.out.print(v + " = "); for(int i = start; i <= end; i++) { if(i - start > 0) System.out.print(" + "); System.out.print(i); } System.out.println(); } }
运行结果很清楚了!
下面仅修改了一下Test.java中的F(),用递归来实现。实际上并没有很强的递归思想,只是形式上是递归的,比较好看,代码如下:
//给出正整数v, 求出它是哪几个连数相加的结果(连数:如2,3,4或4,5) public static void F(int value, int base) { Node node = new Node(); int halfValue = value / 2; if(base <= halfValue) { int sum = 0; int halfCeil = (int) Math.ceil(value * 0.5); for(int i = base; i <= halfCeil ; i++) { sum += i; if(sum == value) //找到一个这样的组合 { node.start = base; node.end = i; node.Display(value); } if(sum >= value) //本轮查找结束,跳出循环 { F(value, base + 1); //开始寻找下一个组合 break; } } } } |