您的位置:首页 > 其它

递归求解整数划分问题 分类: 算法 2014-09-25 21:37 158人阅读 评论(0) 收藏

2014-09-25 21:37 696 查看
定义一个数组dnum用来存储一个划分中的每个数,用show函数来对一次划分进行一次输出,运用递归的方法进行整数的划分,递归的时时候考虑5种情况,分别是n<m,n=m,n>m>1, n>= 1>=m和 0=<n <=m <=1的情况。本程序没有考虑负整数的情况,对于负整数的情况只需要增加一个判断变量flag,flag=1时是负整数,此时稍微增加一下对应的输出函数即可。

/*
Subject:计算机算法设计与分析
Title:整数划分问题:输出一个整数的所有划分并统计总划分数
Coder:learnordie
Date:Sept 11th,2014
*/

/*
算法思路:
定义一个数组dnum用来存储一个划分中的每个数,运用递归的方法进行整数的划分
*/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

//show函数用于将dnum数组中存储的一个整数划分输出
//dnum中存储的是一次整数划分后的各个数,len为这次整数划分好的各数的数目和
void show(int *dnum,int len){
int i;
printf("%d=",dnum[0]);
if(len == 1) {
printf("%d",dnum[1]);
}
else
{
for(i=1;i<len-1;i++){
printf("%d+",dnum[i]);
}
}
printf("%d\n",dnum[len-1]);

}

//递归划分整数,n为待划分的整数,m为最大加数上限
int q(int n,int m,int *dnum,int len){
// n <= m <= 1 或 n<= 1 <= m 的情况
//当n>=1并且m=1时,q(n,m,result,length)=q(n-1,m,result,length)
//当n=0并且m=1时,输出
//当n=1并且m>1时,输出
if(n>=0 && m==1){
if(n==0){
show(dnum,len);
}
else
{
dnum[len] = 1;
q(n-1,m,dnum,len+1);
}
return 1;
}
else if(n==1 && m>1){
dnum[len] = n;
show(dnum,len+1);
return 1;
}
//当n<m时候的情况
else if(n<m){
return q(n,n,dnum,len);
}
//当n=m时候的情况
else if(n==m){
dnum[len] = m;
show(dnum,len+1);
return q(n,m-1,dnum,len)+1;
}
//当n>m>1时候的情况
else{
dnum[len] = m;
return   q(n-m,m,dnum,len+1) + q(n,m-1,dnum,len) ;
}
}

void main(){
int dnum[100]={0};
int t,len;
len = 1;
printf("please enter the number:");
scanf("%d",dnum);
printf("the result is:\n");
t=q(dnum[0],dnum[0],dnum,len);
printf("the number is:%d\n",t);
system("pause");
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐