鱼C论坛

 找回密码
 立即注册
查看: 2972|回复: 11

[已解决]c语言如何实现1到20数字组合,5个数字为一组

[复制链接]
发表于 2021-7-14 21:11:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我突然有个想法,就是运用c语言实现1到20数字组合,5个数字为一组!输出一共有多少组数字,然后把所有不同数字组合输出!但是我怎么写都不行,看来我还是一无所知!!!哪位大神给我一点思路,万分感激!!!!
最佳答案
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[buff_index] = n[i];
        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[1024]; 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[i]);
    printf("\n");
}

int main(void) {
    int n[20]; for(size_t i = 0; i < 20; ++i) n[i] = i + 1;
    combination(n, 20, 5, visit);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-14 21:32:36 | 显示全部楼层

回帖奖励 +5 鱼币

让我动动脑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-14 23:17:04 | 显示全部楼层

回帖奖励 +5 鱼币

参考: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[buff_index] = n[i];
        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[1024]; 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[i]);
    printf("\n");
}

int main(void) {
    int n[20]; for(size_t i = 0; i < 20; ++i) n[i] = i + 1;
    combination(n, 20, 5, visit);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[buff_index] = n[i];
        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[1024]; 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[i]);
    printf("\n");
}

int main(void) {
    int n[20]; for(size_t i = 0; i < 20; ++i) n[i] = i + 1;
    combination(n, 20, 5, visit);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-15 00:03:39 | 显示全部楼层

回帖奖励 +5 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-15 07:35:26 | 显示全部楼层

回帖奖励 +5 鱼币

我要鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-15 21:22:47 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-7-14 23:35
改了一个变量的名字,原来是 n_size,现在改成 size
之前是有 buff_size 和 n_size,后来发现 buff_size  ...

我水平太菜,看得不是很明白,大神能分析一下编程思路吗?万分感激
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

1.png


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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]);
        }
        printf("\n");
        return;
    }
    for(size_t i = 0; i + m <= size; ++i) {
        buff[buff_index] = n[i];
        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[1024];
    combination_sub(n, size, m, buff, 0);
}

int main(void) {
    int n[20];
    for(size_t i = 0; i < 20; ++i) {
        n[i] = i + 1;
    }
    combination(n, 20, 5);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-17 07:06:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-17 16:56:16 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-7-16 09:13
这样试试

很感谢您的分析,我的水平还不行,吃不消,我还需要继续强化基础知识。很感谢你让我走前进的动力!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-11 15:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表