题目描述:随便给出一个正整数, 求出这个数是由哪几个正整数相加,要求相加的这几个数是连续的。
如: 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;
}
}
}
}