c语言如何实现1到20数字组合,5个数字为一组
我突然有个想法,就是运用c语言实现1到20数字组合,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 = 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;
}
改了一个变量的名字,原来是 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-14 23:35
改了一个变量的名字,原来是 n_size,现在改成 size
之前是有 buff_size 和 n_size,后来发现 buff_size...
我水平太菜,看得不是很明白,大神能分析一下编程思路吗?万分感激 创业狂亏三千亿 发表于 2021-7-15 21:22
我水平太菜,看得不是很明白,大神能分析一下编程思路吗?万分感激
我也不知道该怎么讲,关键就是这两行
buff = n; // 从集合中取出第 1 个元素
combination_sub(n + 1 + i, size - 1 - i, m - 1, visit, buff, buff_index + 1); // 从集合中取出剩下的元素
这样试试
#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;
}
{:10_266:} 人造人 发表于 2021-7-16 09:13
这样试试
很感谢您的分析,我的水平还不行,吃不消,我还需要继续强化基础知识。很感谢你让我走前进的动力!{:10_257:} 创业狂亏三千亿 发表于 2021-7-17 16:56
很感谢您的分析,我的水平还不行,吃不消,我还需要继续强化基础知识。很感谢你让我走前进的动力!{:10_2 ...
^_^
页:
[1]