======题外话:我们不仅要有计算机思维,还要运用其他思维,比如:数学思维,来简化或优化我们的计算机程序
题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
直观反应:循环循环在循环,结果终究会出来的。
先进行数学上的分析:
我们要将一个数num表示为若干连续整数的和,那么,考虑一下,这些连续整数应该怎样开始、怎样结束?
形式一:a a+1 a+2 …… a+(n-1)
那么a的范围很容易就是:[1,num/2+1)
形式二:b-(n-1) …… b-2 b-1 b
那么b的范围为:(Math.sqrt(2*num)-1),num/2+1
我们可以从这两个形式分别写程序,或两种都实现,得到一个数后,可以判断一下哪种循环次数要少一点,就采用哪种。
下面就是一个比较简单的程序。上面的修修改改有的是为了更优化,有的是上一种形式的残留的注释,不用太在意。
package t1;
import java.util.Scanner;
public class T1 {
@SuppressWarnings("resource")
public static void main(String[] args) {
//得到要分析的正整数num
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
if (num<3) {
return;
}
//确定最大值界限
//int min = (int) (Math.sqrt(2*num)-1);
int min = 1;
int max = num/2+1;
int reNum = 0;
while (min<max) {
//String r = addnums(num, max--);
String r = addnums(num, min++);
if (r!=null) {
System.out.println(r);
reNum++;
}
}
if (reNum==0) {
System.out.println("NONE");
}
}
public static String addnums(int num,int min){
// int max = num/2+1;
StringBuilder result = new StringBuilder("");
// String result = "";
int total = 0 ;
while (total<num) {
// if (