7-37 整数分解为若干项之和 (20point(s)).c

将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。
输入格式:

每个输入包含一个测试用例,即正整数N (0<N≤30)。
输出格式:

按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N​1​​={n​1​​,n​2​​,⋯}和N​2​​={m​1​​,m​2​​,⋯},若存在i使得n​1​​=m​1​​,⋯,n​i​​=m​i​​,但是n​i+1​​<m​i+1​​,则N​1​​序列必定在N​2​​序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。
输入样例:

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
Impression:
Too difficul,determined to give understanding!!!

Read code attachment section:

//  date:2020/3/13
//  author:xiezhg5
#include<stdio.h>
int s[100];        //拆分结果保存在这个数组里
int top;          //记录个数
int total, n;     //累加数和所求数
int k;            //k为式子个数 
void dfs(int index)  //定义了dfs函数 
{
    int i;
        if (total==n)
		{
            printf("%d=",n);
                for (i=0;i<top-1;i++)
                    printf("%d+",s[i]);
                    k++;
                if (k==4||top==1)
				{
                    k=0;
                    printf("%d\n",s[top-1]);
                }
                else
                    printf("%d;",s[top-1]);
                return;
        }
        if (total>n)         
            return;
        for(i=ndex;i<=n;i++)
		{
            total+= i;
            s[top++]=i;  
            dfs(i);
            total-=i;
            s[--top];      
        }
}
int  main()
{
        while(scanf("%d",&n)==1)
		{
                k=0;
                top=0;
                total=0;
                dfs(1);
        }
        return 0;
}

发布了52 篇原创文章 · 获赞 25 · 访问量 1287

猜你喜欢

转载自blog.csdn.net/qq_45645641/article/details/104849263
今日推荐