C语言学习--数字拆解

原题再现:

3 = 2 + 1 = 1 + 1 + 1 所以3有三种拆法

4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种

5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1 共七种

依此类推,请问一个指定数字NUM的拆解方法个数有多少个?
程序设计:

1、 整型变量n用来记录待判定的数,整型指针t用来指向存放一组成功的结果。整型变量i用以控制初始化数组的循环;

2、 关键算法
递归寻找结果序列 Dismantling;

3、 输出函数,printResult。

算法描述:

1、 首次传入带判定的数n,待产生的结果序列中的数在结果数组中的序号i,结果数组t;

2、 如果n为0,输出结果;否则循环测试结果序列中第i+1个数;

3、 如果i>0并且循环测试的k不于结果序列中在他位置之前的数t[i-1]则执行2,否则执行4;

4、 t[i]
= k; n -= k; i++;

5、 递归判断n的剩余部分;

6、  逆置4,同时返回2.

/*
	功能:数字拆解
	时间:2014-09-08 21:03:40
*/

#include <stdio.h>
#include <malloc.h>

void Dismantling(int n, int i, int *t);	//递归寻找结果序列
void printResult(int i, int *t);	//打印结果

int Count = 0;

int main()
{
	int n;	//待判定的数
	int *t;	//结果序列缓存数组
	int i;	//初始化结果数组变量

	printf("Please Enter a number(n>0):");
	scanf("%d/n",&n);

	t = (int *)malloc(n);
	for(i=0; i<n; i++)
	{
		t[0] = 0;
	}

	Dismantling(n, 0, t);

	//free(t);

	return 0;
}

void Dismantling(int n, int i, int *t)
{
	int k;

	if(n == 0)
	{
		//OutPut Result
		printResult(i, t);
	}
	else
	{
		//Recursive Find Result Sequence
		for(k=1; k<=n; k++)
		{
			if(i>0 && k<t[i-1]) //让大数在,后小数在前,用来防止结果重复
				continue;
			t[i] = k;
			n -= k;
			i++;
			Dismantling(n, i, t);
			i--;
			n +=k;
			t[i] = 1;
		}
	}
}

void printResult(int i, int *t)
{
	int j;
	printf("The %3d Result is :", ++Count);
	for(j=i-1; j>0; j--)
	{
		printf("%d+", t[j]);
	}
	printf("%d\n", t[0]);
}

  结果:

问题:我只要一free(t)就会出现

不知道什么原因,望有专家不吝赐教。

时间: 2024-08-09 06:33:52

C语言学习--数字拆解的相关文章

大一上学期C语言学习心得总结

经过一个学期的C语言学习,大体算是在这个编程语言上入了门,能够通过一些代码解决特定的问题.当然,每次成功将问题转换成代码都小有激动,虽然只是在黑框上输出了一些数字或是字符串. 编程,虽然还不是很懂,但总感觉不只是学习知识这么简单,更多给我的感受是它在潜移默化中培养了人的一种能力,用自己的话来讲就是一种”代码能力“.对于同一个问题,让大家去解开答案,可能经过一些纸笔的运算都能得出结果,但是如何把这个问题转化成代码,这就是一种能力,而仅仅是将问题转换成代码,这是较为浅层次的能力,更深层的便是通过优化

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

【数字拆解】

/* 数字拆解 说明: 这个题目来自于 数字拆解,我们将之改为C语言的版本,并加上说明. 题目是这样的: 3 = 2 + 1 = 1 + 1 + 1 所以有三种拆法 4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种 5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1 共七种 依此类推,请问一个指定数字NUM的拆解方法个数有多少个? 解法: 我们

【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助. 2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格.“朱兆祺STM32手记”(http://bb

C语言学习(二)——字符串和格式化输入输出

C语言学习(二)——字符串和格式化输入输出 1.char数组类型和空字符 C没有为字符串定义专门的变量类型,而是把它存储在char数组里.数组的最后一个位置显示字符\0.这个字符就是空字符,C用它来标记字符串的结束,其ASCII码的值为(或者等同于)0.C的字符串存储时通常以这个空字符结束,该字符的存在意味着数组的单元数必须至少比要存储的字符数多1.计算机可以自己处理大多数这些细节问题(例如,scanf( )会添加'\0'使得数组内容成为C字符串). 2.strlen( )函数与sizeof运算

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data

Perl语言学习笔记 day 1

1.Perl Practical Extraction and Report Language:实用摘录与报表语言 2.多行注释 (1) =需要顶格写 = description statement; =cut (2)末尾的description需要顶格写 <<description; print "Hello,world!\n"; description 3.数字: 所有数字在Perl内都以双精度浮点数格式存储; 5**3:5*5*5: 4.字符串: 最短的字符串为空字符

R语言学习(5)-字符串和因子

字符串和因子 1.字符串 创建字符串 > c("HELLO","WORLD") [1] "HELLO" "WORLD" 使用paste函数连接字符串 > paste(c("hello","hi"),"world") [1] "hello world" "hi world" > paste(c("hel

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.