用c语言将一个数分解成加数相加的方式
用c语言将一个数分解成加数相加的形式
遇到这个问题 没有好思路 麻烦各位大神给点意见 谢谢~
比如说输入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
需要使用递归,当然输出的顺序可以改变,但不能遗漏
------解决思路----------------------
仅供参考
------解决思路----------------------
修改了些,试试
------解决思路----------------------
有点难度
------解决思路----------------------
------解决思路----------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
遇到这个问题 没有好思路 麻烦各位大神给点意见 谢谢~
比如说输入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
需要使用递归,当然输出的顺序可以改变,但不能遗漏
------解决思路----------------------
仅供参考
#include <stdio.h>
#include <stdlib.h>
#define MIN(X,Y) (((X)<(Y))?(X):(Y))
void WriteBuffer(const int * buffer)
{
while (buffer[1] != 0)
{
printf("%d+", *buffer++);
}
printf("%d\n", *buffer);
}
void _splitnum(int * buffer, const int x, const size_t pos)
{
if (x <= 1)
{
buffer[pos + 1] = x;
buffer[pos + 2] = 0;
WriteBuffer(buffer);
}
else
{
size_t npos = pos + 1;
for (int i = 1; i <= MIN(x, buffer[pos]); i++)
{
buffer[npos] = i;
_splitnum(buffer, x - i, npos);
}
}
}
void SplitNum(const int x)
{
if (x <= 0) return;
int * buffer = (int*)malloc(sizeof(int) * (x + 1));
for (int i = 1; i < x; i++)
{
buffer[0] = i;
_splitnum(buffer, x - i, 0);
}
}
int main()
{
int x = 0;
if (scanf("%d", &x))
SplitNum(x);
return EXIT_SUCCESS;
}
------解决思路----------------------
修改了些,试试
------解决思路----------------------
有点难度
------解决思路----------------------
#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]));
}
------解决思路----------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出