拉马努金的整数拆分全排列JAVA实现非递归
点这里:
结果是:组合成100的可能性共有:190569292种!!
不做详细说明了,需要看文字描述的,点上面链接跳转递归方式,查看详细说明
来,直接上代码
/**
*
* @author An
* 拉马努金的整数拆分
*
*/
public class Test04 {
public static void main(String[] args) {
List list= new ArrayList<Long>();
for (int i = 0; i <= 100; i++) {
f1(list,i);
}
System.out.println(list);
System.out.println("组合成"+(list.size()-1)+"的可能性共有:"+list.get(list.size()-1)+"种!!");
}
private static void f1(List<Long> list,int i) {
long result=0;
int count = 1;//表示循环的次数,用来控制下标
int n =1;//表示当前下标下,应该传入的数
boolean flag = true;//控制加减,true=+,false= -
if(i==0||i==1) {
list.add(1L);//0和1的拆分次数固定是1种,也是递归的出口
}else {
while(i-n>=0) {
if(count==1) {
result +=list.get(i-n);
count++;//下标置为第二次
n= count;//第二次应该减掉的数
//count=1的时候,表示循环刚开始,应该添加i-n(默认初始值1)
}else if(count==2) {
result +=list.get(i-n);
count++;//下标继续自增
n =count*2-1;//第三次下标预设
flag=!flag;//此时修改标志位,false=减少
//count=2,循环开始第二次,第一个已添加,第二是i-2,
}else {
if(count%2!=0) {//求模,可以知道是单数or双数,单数无需修改标志位
result=(flag==true ? result+list.get(i-n) : result-list.get(i-n));
//三目运算,根据标志位,决定是+是-
count++;//标志位继续增加
n +=count/2;//后面的单数规律。
}else {//求模,可以知道是单数or双数,单数无需修改标志位
result=(flag==true ? result+list.get(i-n) : result-list.get(i-n));
count++;//标志位继续增加
n +=count;//后面的双数规律
flag = !flag;//双数后要修改标志位
}
}
}
list.add(result);
}
}
}
若有不足之处,望请指出~~~~
结果是:组合成100的可能性共有:190569292种!!