鱼C论坛

 找回密码
 立即注册
查看: 3382|回复: 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 了
现在改回来

  1. #include <stdio.h>

  2. 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) {
  3.     if(m == 0) {visit(buff, buff_index); return;}
  4.     for(size_t i = 0; i + m <= size; ++i) {
  5.         buff[buff_index] = n[i];
  6.         combination_sub(n + 1 + i, size - 1 - i, m - 1, visit, buff, buff_index + 1);
  7.     }
  8. }

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

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

  17. int main(void) {
  18.     int n[20]; for(size_t i = 0; i < 20; ++i) n[i] = i + 1;
  19.     combination(n, 20, 5, visit);
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

让我动动脑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

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

  2. 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) {
  3.     if(m == 0) {visit(buff, buff_index); return;}
  4.     for(size_t i = 0; i + m <= n_size; ++i) {
  5.         buff[buff_index] = n[i];
  6.         combination_sub(n + 1 + i, n_size - 1 - i, m - 1, visit, buff, buff_index + 1);
  7.     }
  8. }

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

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

  17. int main(void) {
  18.     int n[20]; for(size_t i = 0; i < 20; ++i) n[i] = i + 1;
  19.     combination(n, 20, 5, visit);
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-14 23:35:57 | 显示全部楼层    本楼为最佳答案   
改了一个变量的名字,原来是 n_size,现在改成 size
之前是有 buff_size 和 n_size,后来发现 buff_size 并不需要就删除了,但是 n_size 就没有必要指明是 n 的 size 了
现在改回来

  1. #include <stdio.h>

  2. 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) {
  3.     if(m == 0) {visit(buff, buff_index); return;}
  4.     for(size_t i = 0; i + m <= size; ++i) {
  5.         buff[buff_index] = n[i];
  6.         combination_sub(n + 1 + i, size - 1 - i, m - 1, visit, buff, buff_index + 1);
  7.     }
  8. }

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

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

  17. int main(void) {
  18.     int n[20]; for(size_t i = 0; i < 20; ++i) n[i] = i + 1;
  19.     combination(n, 20, 5, visit);
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

我要鱼币
小甲鱼最新课程 -> https://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  ...

我水平太菜,看得不是很明白,大神能分析一下编程思路吗?万分感激
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

1.png


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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-16 09:13:32 | 显示全部楼层
这样试试
  1. #include <stdio.h>

  2. void combination_sub(int n[], size_t size, size_t m, int buff[], size_t buff_index) {
  3.     if(m == 0) {
  4.         for(size_t i = 0; i < buff_index; ++i) {
  5.             printf("%d ", buff[i]);
  6.         }
  7.         printf("\n");
  8.         return;
  9.     }
  10.     for(size_t i = 0; i + m <= size; ++i) {
  11.         buff[buff_index] = n[i];
  12.         combination_sub(n + 1 + i, size - 1 - i, m - 1, buff, buff_index + 1);
  13.     }
  14. }

  15. void combination(int n[], size_t size, size_t m) {
  16.     if(m > 1024) {
  17.         return;
  18.     }
  19.     int buff[1024];
  20.     combination_sub(n, size, m, buff, 0);
  21. }

  22. int main(void) {
  23.     int n[20];
  24.     for(size_t i = 0; i < 20; ++i) {
  25.         n[i] = i + 1;
  26.     }
  27.     combination(n, 20, 5);
  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-17 07:06:33 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

很感谢您的分析,我的水平还不行,吃不消,我还需要继续强化基础知识。很感谢你让我走前进的动力!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 16:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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