一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。
输入描述
一个目标整数T(1<=T<=1000)
输出描述
该整数的所有表达式和表达式的个数。如果有多种表达式,输出要求为:
1.自然数最少的表达式优先输出
2.每个表达式中的自然数按递增的顺序输出,具体格式参见样例。在每个测试数据结束时,输出一行“Result:X”,其中X是最终表达式的个数。
示例1:
输入
9
输出
9=9
9=4+5
9=2+3+4
Result:3
import java.util.Scanner;
public class ContinuSum {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 输入
* 9
*
* 输出
* 9=9
* 9=4+5
* 9=2+3+4
* Result:3
* */
Scanner in = new Scanner(System.in);
int n= in.nextInt();
findNum(n);
in.close();
}
public static void findNum(int sum){
int startNum = 0;
int count = 1;
System.out.println(sum + "=" + sum);
/**
* 研究此题发现实际上是求一个公差为1的等差数列,设首项为x,根据等差数列求和可知sum = (x+(x+(n-1)))*n/2
* 可以推导出首项为x = (sum - n*(n-1)/2) / n = (2*sum -n*(n-1)) / 2*n
* 由于不知道n具体为几项,则通过循环获取,其中若要n最大时,可考虑首项为1
* 即可得到sum >= (1+(1+(n-1)))*n/2
* 推导出sum >= n*(n+1)/2 可得出 n*(n+1)<=2*sum
*/
for (int i = 2; i * (i + 1)<= 2 * sum; i++) {//此处变量设置n为要表示的整数,i为项数,根据题目要求可知i最小为两项
if((2 * sum - i * (i - 1)) % (2 * i) == 0){//求余,若除数为零说明此时的项数i可求得满足条件的首项
startNum = (2 * sum - i * (i - 1)) / (2 * i);//首项
if (startNum>0){//排除可能为负数的情况
StringBuilder result = new StringBuilder();
for (int j = 0; j < i; j++) {//打出所有的项
result.append(startNum++).append("+");//先打印再做变量自增
}
result.deleteCharAt(result.length()-1);//截取掉末尾的+号
System.out.println(sum + "=" + result);
count++;
}
}
}
System.out.println("Result:"+count);
}
}