整数的划分

 整数的分划问题。 
如,对于正整数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

新人,代码写的不好,见谅!

 

posted on 2014-07-26 14:26  asonga  阅读(405)  评论(0编辑  收藏  举报

导航