整数拆分问题(用堆栈方法) 谢谢

qq_41703984 2019-02-10 04:34:01

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

#define MAX_INTEGER 20

/*
整数拆分:输入一个1--20之间的整数,将其拆分成多个整数的和
例如:
5 = 1 + 1 + 1 + 1 + 1
5 = 2 + 1 + 1 + 1
5 = 2 + 2 + 1
5 = 3 + 1 + 1
5 = 3 + 2
5 = 4 + 1
5 = 5
*/
int main()
{
//整数拆分时需要用到的堆栈
int sumStack[MAX_INTEGER]; //各个加数的和的堆栈
int numStack[MAX_INTEGER]; //各个加数的堆栈
int top; //栈顶
int nn;
int ii;

while ( 1==1 )
{
for ( ii=0; ii<MAX_INTEGER; ii++ )
{
sumStack[ii]=0;
numStack[ii]=0;
}
top=0;
nn=0;
printf("nn = ");
scanf("%d", &nn);
if ( (nn<1) || (nn>MAX_INTEGER) )
return 1;

//缺失的代码





printf("end\n");
}
return 0;
}

/////////////////////////////


...全文
202 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-02-14
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
void print(int res[], int num) {
static int L=0;
L++;
printf("%8d:",L);
for (int i=0;i<num;++i) {
printf(" %d", res[i]);
}
printf("\n");
}
void split(int n, int m) {// n表示总数,m表示最大因子
static int res[100];// 保存结果
static int num=-1;// 当前因子下标

if (n<m || n<0 || m<1) return;
num++;
if (0==n) {// 递归终止条件,为0不可再分,直接输出
print(res,num+1);
num--;
return;
} else {
if (n==m) {// 不拆,直接输出
res[num]=m;
print(res,num+1);
num--;
} else {
// 拆分出第一个
res[num]=m;
n=n-m;

if (m>n) m = n; // 最大因子不可能大于总数

for (int i=m;i>=1;--i) {// 循环,第二个因子可以继续拆分,而且按照最大因子不同可以拆分成多个
split(n,i);
}
num--;
}
}
}
void Split(int n) {
if (n<=0) return;
if (100<n) {
printf("Up to 100\n");
return;
}
for (int i=n;i>=1;--i) {
split(n, i);
}
}
void main(int argc,char **argv) {
if (argc<=1) Split(5);
else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));
else Split(atoi(argv[1]));
}
简介 *本框架是一个简单/通用/类型安全/高效的依照面向对象/面向组件的设计模型开发的符合高内聚/低耦合思想的排序框架。 *强调框架二字主要是用于区分以前的易语言排序算法模块,它们通常是强调算法忽略排序业务逻辑,通常写死数据类型/写死排序规则,或者通过使用子程序指针的方式以弱类型安全/弱线程安全的形式艰难的实现业务逻辑拆分,代码维护和扩展犹如重写。而本框架参照的Java的排序框架并结合易语言实情进行开发,功能上不仅毫无损失还拓展了排序算法和排序器业务分离,仅仅是在自定义数据类型的排序器上由于易语言语法上的先天不足需要稍微多拷贝几行代码,而在此框架之前易语言的普通排序算法模块是完全无法和主流语言相提并论的。总之,框架是否牛逼用会的人都会和以前的强调算法而忽略排序逻辑的算法模块说拜拜。 组件 *本框架定义了两种为排序提供服务的组件:“排序器”组件和“排序算法”组件,并已为他们实现了合理的基本结构和两者之间的交互模型,开发者可自行选择合适的排序器及满意的排序算法为其提供排序服务。排序器 *本框架内部已实现多个基本数据类型的排序器 组件包括:整数\小数\文本\字节集\日期时间等排序器,对于自定义数据类型,开发者通过继承“抽象排序器”类,并实现5个简单的抽象方法(子类重写“抽象排序器”类中以“抽象_”开头的方法),提供数组成员的比较及值覆盖业务逻辑即可轻松实现任意类型的排序器。 排序算法 *本框架内部已实现了两个高效的排序算法组件:快速排序算法(递归实现虽然高效但大数据可能堆栈溢出)和希尔排序算法(效率稍低,但无堆栈溢出风险),开发者也可以通过继承“抽象排序算法”类,并实现2个简单的抽象方法(子类重写“抽象排序算法”类中以“抽象_”开头的方法),即可加入本排序框架为任意数据类型提供排序服务(比如实现汇编版xx排序算法,虽然个人不建议使用内联汇编)。 面向组件 *得益于面向组件思想,基于本框架标准的排序器组件可以和任何基于本框架标准的排序算法组件结合使用,在开发基于本框架标准的排序器组件时无需考虑将来会使用哪种算法为用户提供服务(反正任何算法都可以);反之,开发基于本框架标准的排序算法组件时也无需考虑将来会排序哪数据类型(反正可以排序任何数据类型)。 注意事项 排序器需要的额外实现 *由于没有泛型和参数拓展等原因,“抽象排序器”无法制定排序器.排序()/排序器.比较()等方法的模板,这些方法均需要由实现类自己参照框架内已实现的排序方法自己重新写相应的方法。 内联汇编和直接内存读写建议 *由于易语言本身的限制,本框架有部分操作用到了内联汇编和直接内存读写,但被都控制在极小范围内,为实现这些操作的而提供的方法除了参照已有的代码模板可小范围使用外不建议经常使用内联汇编和直接读写内存(包括使用子程序指针),最大可能确保程序健壮。 开闭原则建议 *因为排序算法对象一般不需要存储数据,所以通常都是线程安全的,按照开闭原则建议为排序算法类公开一个单例的全局对象,并私有化算法类以限制被他人修改的可能(框架模块内部实现的排序算法均已如此处理)。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧