`
Touch_2011
  • 浏览: 290463 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

整数划分(C语言实现)

阅读更多
/*
整数的划分问题。 
如,对于正整数n=6,可以分划为: 
6 
5+1 
4+2, 4+1+1 
3+3, 3+2+1, 3+1+1+1 
2+2+2, 2+2+1+1, 2+1+1+1+1 
1+1+1+1+1+1+1 
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
程序输出该整数的所有划分。
*/


#include<stdio.h>
#include<string.h>

//计算划分种数
int divideNumber(int n,int m)
{
	if(m==1 || n==1)
		return 1;
	if(n<m)
		return divideNumber(n,n);
	else if(n==m)
		return divideNumber(n,m-1)+1;
    else
		return divideNumber(n-m,m)+divideNumber(n,m-1);
}

//输出划分结果
void divide(char *s,int first,int other)
{
	int i; 
	static char t[50];//保存上一次的输出结果
	char temp[50],str[3]={0};
	if(other==0){
         if(s[0]==t[0])
	        printf(",%s",s);
         else
             printf("%s",s); 
         strcpy(t,s);
	}
	for(i=other;i>=1;i--){
		if(i>first)
			continue;
		strcpy(temp,s);
		str[0]='+';
		str[1]=i+'0';
		strcat(s,str);
	    divide(s,i,other-i);
		strcpy(s,temp);
	}
}

void main()
{
	int i;
	int n;
	char s[50]={0};
	char str[3]={0};
	scanf("%d",&n);
	printf("划分种数:%d\n",divideNumber(n,n));
	for(i=n;i>=1;i--){
		if(i==n)
			printf("%d",n);
		else{
			s[0]=0;
			str[0]='0'+i;
			strcat(s,str);
			divide(s,i,n-i);   
		}
        puts("");     
	}
}

 

0
2
分享到:
评论

相关推荐

    整数划分问题(实现代码)

    整数划分问题的实现代码 整数划分问题是将一个正整数 n 拆成一组数连加并等于 n 的形式,且这组数中的最大加数不大于 n。这是一种经典的组合数学问题,具有重要的理论价值和实践应用价值。 在解决整数划分问题时,...

    整数划分代码实现

    在C语言中实现整数划分,通常会采用递归或非递归的迭代方法。下面我们将详细介绍这两种方法,并给出相关的代码实现。 **一、递归实现** 递归方法通常是从最简单的基础情况开始,然后逐步增加复杂度。对于整数划分...

    整数划分问题、具体算法实现

    总结来说,整数划分问题的C语言实现涉及到递归和动态规划两种主要方法。虽然递归算法更直观,但动态规划在效率和空间复杂度上具有优势。在实际编程中,需要根据问题规模和性能要求选择合适的方法,并注意优化细节以...

    C语言之整数划分问题(递归法)实例代码

    C语言之整数划分问题(递归法)实例代码 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:  n=m1+m2+…+mi; (其中mi为正...

    整数划分,并输出结果

    ### 整数划分算法解析与实现 #### 一、整数划分的概念 整数划分是组合数学中的一个重要概念,指的是将一个正整数表示为若干个正整数之和的不同方式的数量。例如,数字4可以被划分为1+1+1+1、1+1+2、1+3或4本身等几...

    整数划分的vs2010实现

    本文将深入探讨如何使用C++在VS2010环境下实现整数划分。 首先,我们需要了解整数划分的基本思路。一种常见的方法是使用回溯法(Backtracking),这是一种试探性的解决问题的方法,通过递归尝试所有可能的分支,当...

    整数划分的解析

    基于上述规则,可以编写如下的C语言程序来实现整数划分: ```c #include int split(int n, int m) { if(n || m ) return 0; if(n == 1 || m == 1) return 1; if(n ) return split(n, n); if(n == m) return ...

    10个重要的算法C语言实现源代码

    其C语言实现会涉及到级数求和和区间划分。 5. **牛顿迭代法**: 牛顿迭代法是求解非线性方程根的迭代算法,通过不断逼近根来寻找解决方案。C语言实现中,需要计算函数的导数和雅可比矩阵。 6. **牛顿-科特斯公式*...

    整数划分的回溯法表示

    本篇内容通过Java与C语言两种不同的编程语言来实现整数划分问题的求解,并采用回溯法进行算法设计。 #### 回溯法的基本概念 回溯法是一种通过尝试解决问题所有可能的选项来寻找最优解或所有解的算法策略。其基本...

    算术编码,C语言实现

    3. **C语言实现关键点** - **浮点运算**:C语言中的浮点数运算可能会引入精度损失,需要合理控制以避免影响编码结果。 - **区间管理**:使用浮点数表示区间边界,需要进行区间更新和查找符号对应的子区间。 - **...

    hutc-整数划分问题 参考代码

    在本篇分析中,我们将详细介绍如何通过编程实现整数划分问题的求解,并深入理解提供的参考代码。 #### 知识点解析 1. **动态规划**: - 动态规划是一种解决最优化问题的有效算法策略,它将问题分解为子问题,避免...

    C语言版本的整数划分

    实现整数的划分 如3 3 2 1 1 1 1

    C语言实现JPEG源码

    本文将深入探讨如何使用C语言实现JPEG(Joint Photographic Experts Group)编码和解码,这是一种广泛用于图像压缩的标准。 JPEG是1992年制定的一种有损图像压缩标准,它通过应用离散余弦变换(DCT)和量化等技术,...

    经典排序算法(C语言实现).zip

    C语言实现的关键在于如何选择基准以及如何划分数组。 5. 归并排序(Merge Sort) 归并排序也是一种分治算法,将数组分为两半,分别排序后再合并。C语言实现通常使用递归和辅助数组来完成这一过程。 6. 堆排序...

    sdes 简化DES用C语言实现

    ### SDES简化DES用C语言实现相关知识点 #### 一、背景介绍 SDES(Simplified Data Encryption Standard)是DES(Data Encryption Standard)的一种简化版本,主要用于教学目的,以便更好地理解对称加密算法的工作...

    C语言实现最短路径规划

    编写高效且内存管理合理的代码是C语言实现中的挑战,因为C语言没有内置的高级数据结构和自动垃圾回收机制。 在"Final上交文件"中,可能包含了项目的源代码、测试用例、执行结果以及可能的报告文档。源代码应该清晰...

    数据结构c语言算法实现

    10. **整数划分**:这是组合数学的一个问题,寻找一个整数的所有非负整数子集之和等于该整数。C语言实现可能涉及递归或动态规划。 了解并熟练掌握这些数据结构和算法对于提升编程能力至关重要。通过C语言实现它们,...

    JPEG编解码的c语言实现

    C语言实现JPEG编解码涉及到多个关键步骤,下面将详细解释这些过程。 1. **图像预处理**: 在编码之前,原始图像通常会被转换成YCbCr颜色空间,这是因为YCbCr对人眼感知更敏感,可以更高效地进行压缩。同时,图像会...

Global site tag (gtag.js) - Google Analytics