[算法]将一个正整数拆分成若干个正整数的和,输出所有的结果不重复
2016-09-26 09:22
351 查看
推荐先看我的一篇介绍Set去重的博文地址是
http://blog.csdn.net/bug_moving
看了这个之后,再来看下面的程序基本就能看懂了
至此这个问题基本解决,我也没有考虑效率问题啥,也不知道是不是效率超标了,先就这样吧。
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; } }
运行截图
至此这个问题基本解决,我也没有考虑效率问题啥,也不知道是不是效率超标了,先就这样吧。
相关文章推荐
- 将一个正整数n,拆分成连续的自然数之和,输出所有可能的情况
- 给定一个只包含小写字母的字符串,删除重复的字母,每个字母只出现一次。在所有结果中,输出字典顺序最小的。
- 编程产生一个int数组,长度为30,并向其中随机插入1-30,并且不能重复输出数组。实现一个冒泡排序算法对其进行排序,输出排序结果
- 输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
- 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个
- 算法习题51:输入一个正数n,输出所有和为n连续正数序列
- 输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 输入一个n,输出结果1 2 3---经典算法
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
- 找以其中一个字段为不重复记录,但结果要显示所有字段内容
- 201111621401-白乐乐-判断一个正整数是否为质数的算法。函数签名如下 int isPrime(long a) 输入:一个长整数a 输出:返回1(为质数),返回0(非质数)
- 一个消除重复排列的所有输入字符串的排列算法
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 如果一个正整数可以由连续正整数求和而来,输出所有可能的组合
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 设计一个程序,从键盘上输入若干字符串,利用算法库中的查找函数对给定的字符串进行查找,将查找后的结果输出
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。按照数组下标输出结果。
- 不同的取法输出顺序可以不考虑。取字符( 从标准输入读入一个由字母构成的串(不大于30个字符)。从该串中取出3个不重复的字符,求所有的取法。取出的字符,要求按字母升序排列成一个串。)
- 网易笔试题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]