赞
踩
给定一个正整数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,是最短的分解序列。
- import java.util.Deque;
- import java.util.LinkedList;
- import java.util.Scanner;
-
- public class Main {
- public static void main(String[] args) {
- // int n = 10;
- Scanner scanner = new Scanner(System.in);
- int n = scanner.nextInt();
- // n 为奇数
- // deque前后都可以取元素,方便
- Deque<Integer> deque = new LinkedList<>();
- // 标识位,看是否可以拆解成连续数相加
- boolean flag = false;
- // n为奇数
- if (n % 2 == 1) {
- System.out.println(n + "=" + n / 2 + "+" + (n / 2 + 1));
- return;
- } else {
- // n为偶数
- int start = n / 2;
- int sum = 0;
- // 从大数开始试
- for (int i = start; i > 0; i--) {
- deque.add(i);
- sum += i;
- if (sum == n) {
- flag = true;
- break;
- } else if (sum > n) {
- sum -= deque.peek();
- deque.poll();
- }
- }
- }
- // 不能拆解输出"N"
- if(flag == false){
- System.out.println("N");
- return;
- }
- // 可以的话从deque中取元素出来,注意顺序
- System.out.print(n + "=");
- while (deque.size() > 1) {
- System.out.print(deque.pollLast());
- System.out.print("+");
- }
- System.out.println(deque.pollLast());
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。