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


    定义一个数组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
    ",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:
    ");
    	t=q(dnum[0],dnum[0],dnum,len);
    	printf("the number is:%d
    ",t);
    	system("pause");
    }
    




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Idea安装Mevn
    Spring_AOP
    Java_AOP原理
    Spring_数据校验和自定义检验规则和分组校验
    spring全局异常处理
    拦截器和自定义注解@interface
    linux下开启、关闭、重启mysql服务命令
    springboot的HelloWorld~~~
    切面自动装配注意点
    oracle分页
  • 原文地址:https://www.cnblogs.com/learnordie/p/4657011.html
Copyright © 2020-2023  润新知