整数划分 (二)

2014-11-24 11:42:09 · 作者: · 浏览: 2
length - 1];
rca[0] = ca[0] + ca[1] ;
System.arraycopy(ca, 2, rca, 1, ca.length - 2);
return rca;
}
return null;
}
public static void main(String[] args) {
new IntegerSplit().split(10);
}
}

import java.util.ArrayList;
import java.util.List;

public class IntegerSplit {
private List result = new ArrayList();
public void split(int m) {
//初始化

result.add(new int[]{1,1});
result.add(new int[]{2});
if (m == 1) {
System.out.println("1=1");
System.out.println("一共有:1种");
return ;
} else {
for (int i = 3; i <= m; i++) {
int size=result.size();
for(int j=0;j int[] ca=result.get(j);
int[] newca=new int[ca.length+1];
newca[0]=1;
System.arraycopy(ca, 0, newca, 1, ca.length);
ca=null;
ca=newca;
result.set(j, ca);
int[] cs=merger(ca);
if(cs!=null){
result.add(cs.clone());
}
}
result.add(new int[]{i});

}
}
//打印结果
for(int[] ca:result){
System.out.print(m+"=");
for(int p=0;p System.out.print(ca[p]+"+");
}
System.out.print(ca[ca.length-1]);
System.out.println();
}
System.out.println("一共有:"+result.size()+"种");

}
//合并
public int[] merger(int[] ca) {
if (ca.length <= 2)
return null;
if (ca[0] + ca[1] <= ca[2]) {
int[] rca = new int[ca.length - 1];
rca[0] = ca[0] + ca[1] ;
System.arraycopy(ca, 2, rca, 1, ca.length - 2);
return rca;
}
return null;
}
public static void main(String[] args) {
new IntegerSplit().split(10);
}
}
输出:


[java]
10=1+1+1+1+1+1+1+1+1+1
10=1+1+1+1+1+1+1+1+2
10=1+1+1+1+1+1+1+3
10=1+1+1+1+1+1+2+2
10=1+1+1+1+1+1+4
10=1+1+1+1+1+2+3
10=1+1+1+1+1+5
10=1+1+1+1+2+2+2
10=1+1+1+1+2+4
10=1+1+1+1+3+3
10=1+1+1+1+6
10=1+1+1+2+2+3
10=1+1+1+2+5
10=1+1+1+3+4
10=1+1+1+7
10=1+1+2+2+2+2
10=1+1+2+2+4
10=1+1+2+3+3
10=1+1+2+6
10=1+1+3+5
10=1+1+4+4
10=1+1+8
10=1+2+2+2+3
10=1+2+2+5
10=1+2+3+4
10=1+2+7
10=1+3+3+3
10=1+3+6
10=1+4+5
10=1+9
10=2+2+2+2+2
10=2+2+2+4
10=2+2+3+3
10=2+2+6
10=2+3+5
10=2+4+4
10=2+8
10=3+3+4
10=3+7
10=4+6
10=5+5
10=10
一共有:42种

10=1+1+1+1+1+1+1+1+1+1
10=1+1+1+1+1+1+1+1+2
10=1+1+1+1+1+1+1+3
10=1+1+1+1+1+1+2+2
10=1+1+1+1+1+1+4
10=1+1+1+1+1+2+3
10=1+1+1+1+1+5
10=1+1+1+1+2+2+2
10=1+1+1+1+2+4
10=1+1+1+1+3+3
10=1+1+1+1+6
10=1+1+1+2+2+3
10=1+1+1+2+5
10=1+1+1+3+4
10=1+1+1+7
10=1+1+2+2+2+2
10=1+1+2+2+4
10=1+1+2+3+3
10=1+1+2+6
10=1+1+3+5
10=1+1+4+4
10=1+1+8
10=1+2+2+2+3
10=1+2+2+5
10=1+2+3+4
10=1+2+7
10=1+3+3+3
10=1+3+6
10=1+4+5
10=1+9
10=2+2+2+2+2
10=2+2+2+4
10=2+2+3+3
10=2+2+6
10=2+3+5
10=2+4+4
10=2+8
10=3+3+4
10=3+7
10=4+6
10=5+5
10=10
一共有:42种

另外加多一段只求划分总数,不求过程的代码:


[java]
public class ZSHF {
public static int q(int n,int m){
if(n<1||m<1)return 0;
if(n==1||m==1)return 1;
if(n if(n==m)return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
public static void main(String[] args) {
int number=10;
int result=q(number,number);
System.out.println("对整数"+number+"的划分一共有:"+result+"种");

}
}

public class ZSHF {
public static int q(int n,int m){
if(n<1||m<1)return 0;
if(n==1||m==1)return 1;
if(n if(n==m)return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
public static void main(String[] args) {
int number=10;
int result=q(number,number);
System.out.println("对整数"+number+"的划分一共有