首页 > 编程知识 正文

数的分解,也就是一个数可以分成几和几,数的分解合成的格式怎么写

时间:2023-05-04 22:06:06 阅读:273138 作者:954

题目:把一个数分解成任意几个数之和,把一个数的所有和式分解的结果全部输出出来, 例如:4的结果有,(1+3),(2+2),(1+1+2),(1+1+1+1)

由例子可见,该程序是去重的,应为1+1+2也可以写成1+2+1 ,所以,写方法必须要去重

package org.jeecg.modules.applet.controller;import java.util.*;/** * 把一个数分解成任意几个数之和,把一个数的所有和式分解的结果全部输出出来 * 例如:4的结果有,(1+3),(2+2),(1+1+2),(1+1+1+1) */public class Composition extends ArrayList<Integer> { /** * 重写equals方法方便去重,排除掉重复的数据 * @param other * @return */ @Override public boolean equals(Object other){ Composition comp = (Composition)other; Collections.sort(this); Collections.sort(comp); if(this.isEmpty() || comp.isEmpty() || this.size() != comp.size()) return false; for(int i=0; i<this.size(); i++) if(this.get(i) != comp.get(i)) return false; return true; } @Override public int hashCode() { return 0; }}class main { public static void main(String[] args) { int n=1; Scanner sc=new Scanner(System.in); //在控制台手动输入值 按enter键 便可得到结果 n=sc.nextInt(); System.out.println(toStr(calc(n))); } public static Set<Composition> calc(int n) { Set<Composition> devideSet = new HashSet<Composition>(); Composition Composition = new Composition(); switch (n) {//如果是1直接返回1 case 1: Composition.add(1); devideSet.add(Composition); return devideSet; case 2://如果是2返回1+1 Composition.add(1); Composition.add(1); devideSet.add(Composition); return devideSet; default: for (int i = 1; i <= n / 2; i++) { Composition = new Composition(); Composition.add(i); Composition.add(n - i); devideSet.add(Composition); if (i <= n - i) { Set<Composition> partial_pos = calc(n - i);//递归调用 for (Composition pos : partial_pos) { //当n==2时会走这个方法 pos.add(i); devideSet.add(pos); } } } return devideSet; } } public static String toStr(Set<Composition> devideSet) { String str = ""; for (Composition de : devideSet) str += toStr(de); return str; } public static String toStr(Composition Composition) {//将数字拼接成表达式 String str = Composition.get(0) + ""; for (int i = 1; i < Composition.size(); i++) str += (" + " + Composition.get(i)); str += "n"; return str; }}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。