整数的划分
整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1, 2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
程序输出该整数的所有划分。
这个题目我用的递归,但是思路和我网上看到的不一样,貌似更简单一点,
/**
* 5=1+1+1+1+1 4=1+1+1+1 3=1+1+1 2=1+1 1=1
* 5=1+1+1+2 4=1+1+2 3=1+2 2=2
* 5=1+1+3 4=1+3 3=3
* 5=1+2+2 4=2+2
* 5=1+4 4=4
* 5=2+3
* 5=5
*/
//观察以上整数划分,n+1的划分包括n的所有划分+1,n+1=n+1,和不带1的所有划分三部分,
//其中第三部分,可以从是第一部分中求得,首先划分的数字都从小到大排列,如上所示,
//如果一个划分的元素个数大于2,且前两个元素之和小于等于第三个个数,
//那么合并这个划分的前两个数,其他的不变,从而生成新的划分
代码如下:
public static Map getlist(int n){
Map<String,String> map = new HashMap<String,String>();
if(n==1){
map.put("1", "1=");
return map;
}
map = getlist(n-1);
Map<String, String> map2 = new HashMap();
for (Map.Entry entry : map.entrySet()) {
String key = (String) entry.getKey( );
String value = (String) entry.getValue( );
String str =iscreate("1+"+key);
if(str!=null){
map2.put(str, String.valueOf(Integer.valueOf(value.replace("=", ""))+1)+"=");
}
map2.put("1+"+key, String.valueOf(Integer.valueOf(value.replace("=", ""))+1)+"=");
}
map2.put(""+n, n+"=");
return map2;
}
public static String iscreate(String s){
String[]str=s.trim().split("\\+");
if(str.length>=3&&(Integer.valueOf(str[0])+Integer.valueOf(str[1])<=Integer.valueOf(str[2]))){
return String.valueOf(Integer.valueOf(str[0])+Integer.valueOf(str[1]))+s.substring(3);
}
return null;
}
public static void main(String[]args){
System.out.println("请输入要划分的整数:");
Scanner s = new Scanner(System.in);
int n=System.nextInt();
Map<String,String> map = getlist(7);
TreeMap<String,String> treemap = new TreeMap<String,String>(map);
for (Map.Entry entry : treemap.entrySet()) {
String key = (String) entry.getKey( );
String value = (String) entry.getValue( );
System.out.println(value+key);
}
}
结果如下:
请输入要划分的整数:
7
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
7=7
新人,代码写的不好,见谅!