打印出一个实数的所有分解
例如:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
程序怎么写,我们老师提示说用递归+栈来实现。
没时间的给个算法也行,但是写具体点。
谢谢了~~~~
例如:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
程序怎么写,我们老师提示说用递归+栈来实现。
没时间的给个算法也行,但是写具体点。
谢谢了~~~~
你先写2的
2可以分为1和1
然后再递归调用直到N为2比如说:
fun(int n)
{
if(n == 2)
{
return 1+1;
}
else{
print(n-1"+"1);
return (n-1)+1;
}
}
当然这个不行啦
但是只是一个想法,用这种办法来实现
具体怎么实现你想一想吧
我也没时间了
int sum,j,k;
long all=0; public void fun1(int a[],int ii,int n)
{
int i,jj,sumsum;
jj=j;
sumsum=sum;
for(i=ii;i<n;i++)
{
sum=sumsum;j=jj;/*每一次递归的时候都要将j和sum的值按找传递过来的值初始化*/
if(sum+i>n)/*如果加上一个数后大于输入的数了就跳出循环*/
break;
else if(sum+i==n)/*如果通过递归几次加起来的数都相同就把数组输出*/
{
all++;
a[++j]=i;
for(k=0;k<=j;k++)
//System.out.println("j"+j);
System.out.print(a[k]);
break;
}
a[++j]=i;/*其他情况就把数保存到数组中,继续递归*/
sum+=i;
fun1(a,i,n);
}
}
public void fun(int n)
{
int i;
int a[]= new int[100];
for(i=1;i<=n/2;i++)/*第一个数的范围是这样大小的*/
{
j=0;/*用j变量来记录下小标,然后把符合条件的数组最后输出来*/
sum=0;
a[j]=i;
sum+=i;/*sum变量是用来统计几个数加起来的和是否等于输入的数*/
fun1(a,i,n);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
number nu =new number();
nu.fun(7);
}
}
import java.lang.Integer;
public class test{
public int primary;
public void analyze(int m,Vector temp)
{
//flag is identifier of the end!
if(m == 0)
{
printVec(temp);
return;
}
for(int i=m;i >= 1; i--)
{
if(!lessThan(i,temp))
{
continue;
}
Vector vec = new Vector(temp.size()+1);
vec.addAll(temp);
vec.add(new Integer(i));
analyze(m-i,vec);
}
return;
}
public boolean lessThan(int n,Vector temp)
{
for(int m =0; m<temp.size();m++)
{
int k = ((Integer)temp.get(m)).intValue();
if(n>k)
return false;
}
return true;
}
public void printVec(Vector vec)
{
System.out.print("\n"+primary+"=");
for(int m =0; m<vec.size();m++)
{
if( m == vec.size()- 1)
System.out.print(vec.get(m));
else
System.out.print(vec.get(m)+"+");
}
}
public static void main(String[] args) {
test t = new test();
t.primary = 12;
t.analyze(12,new Vector());
}
}
这只是个用C写的函数,在主函数中调用即可啦void fun(int n)
{
if(n == 2)
{
printf("1+1");
return;
}
else{
for(int m = 2;m<(n+1)/2; m++) //只需循环一半就行
{
printf("%d+%d",m,n-m);
fun(m); //递归调用
fun(n-m);
}
}
}