创业狂亏三千亿 发表于 2021-7-14 21:11:39

c语言如何实现1到20数字组合,5个数字为一组

我突然有个想法,就是运用c语言实现1到20数字组合,5个数字为一组!输出一共有多少组数字,然后把所有不同数字组合输出!但是我怎么写都不行,看来我还是一无所知!!!哪位大神给我一点思路,万分感激!!!!

萝卜里 发表于 2021-7-14 21:32:36

让我动动脑

人造人 发表于 2021-7-14 23:17:04

参考:http://www.360doc.com/content/17/1115/22/7300976_704186606.shtml
#include <stdio.h>

static void combination_sub(const int n[], size_t n_size, size_t m, void (*const visit)(const int n[], size_t size), int buff[], size_t buff_index) {
    if(m == 0) {visit(buff, buff_index); return;}
    for(size_t i = 0; i + m <= n_size; ++i) {
      buff = n;
      combination_sub(n + 1 + i, n_size - 1 - i, m - 1, visit, buff, buff_index + 1);
    }
}

void combination(const int n[], size_t n_size, size_t m, void (*const visit)(const int n[], size_t size)) {
    if(m > 1024) return;
    int buff; combination_sub(n, n_size, m, visit, buff, 0);
}

void visit(const int n[], size_t size) {
    for(size_t i = 0; i < size; ++i) printf("%d ", n);
    printf("\n");
}

int main(void) {
    int n; for(size_t i = 0; i < 20; ++i) n = i + 1;
    combination(n, 20, 5, visit);
    return 0;
}

人造人 发表于 2021-7-14 23:35:57

改了一个变量的名字,原来是 n_size,现在改成 size
之前是有 buff_size 和 n_size,后来发现 buff_size 并不需要就删除了,但是 n_size 就没有必要指明是 n 的 size 了
现在改回来

#include <stdio.h>

static void combination_sub(const int n[], size_t size, size_t m, void (*const visit)(const int n[], size_t size), int buff[], size_t buff_index) {
    if(m == 0) {visit(buff, buff_index); return;}
    for(size_t i = 0; i + m <= size; ++i) {
      buff = n;
      combination_sub(n + 1 + i, size - 1 - i, m - 1, visit, buff, buff_index + 1);
    }
}

void combination(const int n[], size_t size, size_t m, void (*const visit)(const int n[], size_t size)) {
    if(m > 1024) return;
    int buff; combination_sub(n, size, m, visit, buff, 0);
}

void visit(const int n[], size_t size) {
    for(size_t i = 0; i < size; ++i) printf("%d ", n);
    printf("\n");
}

int main(void) {
    int n; for(size_t i = 0; i < 20; ++i) n = i + 1;
    combination(n, 20, 5, visit);
    return 0;
}

超级玛尼哄 发表于 2021-7-15 00:03:39

学习学习

此方星河 发表于 2021-7-15 07:35:26

我要鱼币

创业狂亏三千亿 发表于 2021-7-15 21:22:47

人造人 发表于 2021-7-14 23:35
改了一个变量的名字,原来是 n_size,现在改成 size
之前是有 buff_size 和 n_size,后来发现 buff_size...

我水平太菜,看得不是很明白,大神能分析一下编程思路吗?万分感激

人造人 发表于 2021-7-15 21:32:06

创业狂亏三千亿 发表于 2021-7-15 21:22
我水平太菜,看得不是很明白,大神能分析一下编程思路吗?万分感激




我也不知道该怎么讲,关键就是这两行
buff = n;                // 从集合中取出第 1 个元素
combination_sub(n + 1 + i, size - 1 - i, m - 1, visit, buff, buff_index + 1);               // 从集合中取出剩下的元素


人造人 发表于 2021-7-16 09:13:32

这样试试
#include <stdio.h>

void combination_sub(int n[], size_t size, size_t m, int buff[], size_t buff_index) {
    if(m == 0) {
      for(size_t i = 0; i < buff_index; ++i) {
            printf("%d ", buff);
      }
      printf("\n");
      return;
    }
    for(size_t i = 0; i + m <= size; ++i) {
      buff = n;
      combination_sub(n + 1 + i, size - 1 - i, m - 1, buff, buff_index + 1);
    }
}

void combination(int n[], size_t size, size_t m) {
    if(m > 1024) {
      return;
    }
    int buff;
    combination_sub(n, size, m, buff, 0);
}

int main(void) {
    int n;
    for(size_t i = 0; i < 20; ++i) {
      n = i + 1;
    }
    combination(n, 20, 5);
    return 0;
}

Kayko 发表于 2021-7-17 07:06:33

{:10_266:}

创业狂亏三千亿 发表于 2021-7-17 16:56:16

人造人 发表于 2021-7-16 09:13
这样试试

很感谢您的分析,我的水平还不行,吃不消,我还需要继续强化基础知识。很感谢你让我走前进的动力!{:10_257:}

人造人 发表于 2021-7-17 17:14:12

创业狂亏三千亿 发表于 2021-7-17 16:56
很感谢您的分析,我的水平还不行,吃不消,我还需要继续强化基础知识。很感谢你让我走前进的动力!{:10_2 ...

^_^
页: [1]
查看完整版本: c语言如何实现1到20数字组合,5个数字为一组