c - 如何打印编号给定整数可以用不同数字的总和来表示的方式?

标签 c algorithm

假设我有一个数字 5,现在表示 5 的可能组合是:

4 + 1

3 + 2

3 + 1 + 1

2 + 2 + 1

2 + 1 + 1 + 1

1 + 1 + 1 + 1 + 1

我们如何用 C 语言为此创建一个程序?

最佳答案

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

int *LIST;   /* result work list */
int LEVEL=-1;/* partition level */

void print (void){
    int i;

    for(i=LEVEL;i>=0;--i){
        printf("%d",LIST[i]);
        if(i!=0)
            printf(" + ");
    }
    printf("\n");
}

void part(int n){
    int i, first; /* first is last-1  */

    if(n<1) return ;
    LIST[++LEVEL]=n; /* add list tail */
    print();

    first=(LEVEL==0) ? 1 : LIST[LEVEL-1];

    for(i=first;i<=n/2;i++){ /* candidate > first */
        LIST[LEVEL]=i; /* last element replace */
        part(n-i);
    }
    LEVEL--;
    return;
}

int main(int argc, char **argv){
    int N;

    N=(argc>1)?atoi(argv[argc-1]):5;

    LIST=(int *)calloc(N, sizeof(int));
    if(LIST==NULL){
        fprintf(stderr, "not enough memory\n");
        return -1;
    }

    part(N);
    free(LIST);

    return 0;
}
/* result
5
4 + 1
3 + 1 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
2 + 2 + 1
3 + 2
*/

关于c - 如何打印编号给定整数可以用不同数字的总和来表示的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674426/

相关文章:

c - 如何获得C函数的实际输出?

c++ - GCC -Wuninitialized/-Wmaybe-uninitialized 问题

python - Spark 中的无序集或类似集?

java - 如何在java中的二叉树上实现深度优先搜索(DFS)?

找到覆盖项目列表所需的最小容器数的算法

c - 如何使用 C 在 Linux 中获取打开的套接字列表?

我可以更快地在整数之间传输符号(在 C5515 上)吗?

c - 如何仅使用单个端口减少 UDP 套接字通信中的消息丢失?

algorithm - 推箱子游戏 : move boxes automatically

最大(最小(匹配))的算法?