[算法]将一个正整数拆分成若干个正整数的和,输出所有的结果不重复
来源:互联网 发布:visio绘制网络拓扑图 编辑:程序博客网 时间:2024/05/21 09:56
推荐先看我的一篇介绍Set去重的博文地址是
http://blog.csdn.net/bug_moving
看了这个之后,再来看下面的程序基本就能看懂了
题目
我也不太记得,因为是朋友给我口述的,然后给了我一个截图,看了图片大致也能知道题目要我们做什么
package yn;import java.util.ArrayList;import java.util.Collections;import java.util.HashSet;import java.util.Set;class Composition extends ArrayList<Integer> { @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; }}/** * 用递归法,比如2=1+1,3=1+(2的所有组成法),5需要分解1+4,2+3,因为3+2和2+3是一样的,for循环只要到i<=n/2就够了.然后就是剔除1+1+2和1+2+1的情况,继承set的特性重写了Composition(每个拆分的方式)的equals.懒得读取n值了,直接在main里面赋值给n * @author yxx * */public class lhy { public static void main(String[] args) { int n = 5; System.out.println(toStr(calc(n))); } public static Set<Composition> calc(int n) { Set<Composition> possibility = new HashSet<Composition>(); Composition composition = new Composition(); switch (n) { case 1: composition.add(1); possibility.add(composition); return possibility; case 2: composition.add(1); composition.add(1); possibility.add(composition); return possibility; default: for (int i = 1; i <= n / 2; i++) { composition = new Composition(); composition.add(i); composition.add(n - i); possibility.add(composition); if (i <= n - i) { Set<Composition> partial_pos = calc(n - i); for (Composition pos : partial_pos) { pos.add(i); possibility.add(pos); } } } return possibility; } } public static String toStr(Set<Composition> possibility) { String str = "total : " + possibility.size() + "\n"; for (Composition pos : possibility) str += toStr(pos); 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 1
- [算法]将一个正整数拆分成若干个正整数的和,输出所有的结果不重复
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 将一个正整数n,拆分成连续的自然数之和,输出所有可能的情况
- 将一个正整数划分成若干正整数的和,输出每一种划分方法
- 对于1个正整数N,将其拆分成几个正整数的和,如何拆分可使得其乘积最大?
- 将正整数n划分成k个不同正整数的乘积,输出所有划分方法
- JAVA:递归实现输出正整数和等于n的所有不增的正整数和式
- 将一个正整数分解为一系列不重复的整数的和
- 把正整数n表示成若干个不同的正整数的和,求积的最大值
- 把正整数n表示成若干个正整数的和,求积的最大值
- 设有n个正整数,将它们连成一排组成一个整数,请编程输出其中最大的结果。
- 给定一个正整数,求其分解成3个正整数的所有可能组合数
- 输出正整数的所有分割
- 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。
- 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。
- POJ - 1032 Parliament( 把正整数n表示成若干个不同的正整数的和,求积的最大值)
- 排序文件中的N个不重复的正整数
- C#中一个异步回调的实例
- JasSipt之XML DOM对象
- 2016/09/26 8:23
- spring实例和调用过程
- Java的基本程序设计结构
- [算法]将一个正整数拆分成若干个正整数的和,输出所有的结果不重复
- iOS_DEBUG
- HTML格式转成MHT格式的组件
- [Linux]--add user to sudo group
- SWT GridLayout网格式布局
- win7安装使用mosquitto,vs2010中使用libmosquittopp
- MPU6050对卡尔曼、一阶互补滤波、二阶互补滤波的比较
- FZU Problem 2140 Forever 0.5(计算几何构造,依旧考查思维)
- 操作系统内存状态与postgresql内存设置