打印出一个实数的所有分解
例如:
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
程序怎么写,我们老师提示说用递归+栈来实现。
没时间的给个算法也行,但是写具体点。
谢谢了~~~~

解决方案 »

  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;
       }
    }
    当然这个不行啦
    但是只是一个想法,用这种办法来实现
    具体怎么实现你想一想吧
    我也没时间了
      

  2.   

    public class number {
    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);

    }
    }
      

  3.   

    import java.util.Vector;
    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());

    }
    }
      

  4.   

    终于知道啦
    这只是个用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);
            }
        }
    }