题目描述:
给定一个正整数n,如果能够分解为m(m > 1)个连续正整数之和,请输出所有分解中,m最小的分解。
如果给定整数无法分解为连续正整数,则输出字符串"N"。
输入描述:
输入数据为一整数,范围为(1, 2^30]
21
输出:
21=10+11
补充说明:
21可以分解的连续正整数组合的形式有多种
21=1+2+3+4+5+6
21=6+7+8
21=10+11
输出,21=10+11,是最短的分解序列。
示例1
输入:
21
输出:
21=10+11
说明:
21可以分解的连续正整数组合的形式有多种
21=1+2+3+4+5+6
21=6+7+8
21=10+11
因21=10+11,是最短的分解序列。所以答案是21=10+11
代码
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//输入的整数
//连续相加等于n的集合
List<Integer> list = new ArrayList<Integer>();
int len=n;
//长度最短的集合即为最短分解序列
for (int i = 1; i <= n/2+1; i++) {
int temp = f(n,i);
if(temp != 0 && temp-i<len){
len = temp-i;
list.clear();
for(int j=i;j<=temp;j++){
list.add(j);
}
}
}
System.out.print(n+"="+list.get(0));
for(int j=1;j<list.size();j++){
System.out.println("+"+list.get(j));
}
}
//输入开始序列,找到相加等于n的结束序列,找不到返回0
public static int f(int n, int m) {
int sum = 0;
for (int i = m; i <= n/2+1; i++) {
sum+=i;
if(sum==n){
return i;
}
if(sum>n){
return 0;
}
}
return 0;
}
}