当前位置:   article > 正文

华为OD-D卷数的分解

华为OD-D卷数的分解

给定一个正整数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,是最短的分解序列。

题目解析:如果是奇数就很简单,一定能找到相邻的两个数相加为 n,那么剩下的数该怎么处理呢?

因为要找到连续的正整数,而且m最小,那么即使有多种分解方法,在这个m里面的分解数里一定存在所有分解方法中最大的数,例如15可以分为(1+2+3+4+5),或者(4+5+6),那么我们找的结果中包含m中会存在这个最大的6。

这样就好办了,我们只需要从15/2->1开始算,这个最大的数是多少,不断的去试,7可以吗,要保证连续7+6=13<15,再加,7+6+5>18,显然不行。

  1. import java.util.Deque;
  2. import java.util.LinkedList;
  3. import java.util.Scanner;
  4. public class Main {
  5. public static void main(String[] args) {
  6. // int n = 10;
  7. Scanner scanner = new Scanner(System.in);
  8. int n = scanner.nextInt();
  9. // n 为奇数
  10. // deque前后都可以取元素,方便
  11. Deque<Integer> deque = new LinkedList<>();
  12. // 标识位,看是否可以拆解成连续数相加
  13. boolean flag = false;
  14. // n为奇数
  15. if (n % 2 == 1) {
  16. System.out.println(n + "=" + n / 2 + "+" + (n / 2 + 1));
  17. return;
  18. } else {
  19. // n为偶数
  20. int start = n / 2;
  21. int sum = 0;
  22. // 从大数开始试
  23. for (int i = start; i > 0; i--) {
  24. deque.add(i);
  25. sum += i;
  26. if (sum == n) {
  27. flag = true;
  28. break;
  29. } else if (sum > n) {
  30. sum -= deque.peek();
  31. deque.poll();
  32. }
  33. }
  34. }
  35. // 不能拆解输出"N"
  36. if(flag == false){
  37. System.out.println("N");
  38. return;
  39. }
  40. // 可以的话从deque中取元素出来,注意顺序
  41. System.out.print(n + "=");
  42. while (deque.size() > 1) {
  43. System.out.print(deque.pollLast());
  44. System.out.print("+");
  45. }
  46. System.out.println(deque.pollLast());
  47. }
  48. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/955856
推荐阅读
相关标签
  

闽ICP备14008679号