求:请用C语言编写,1到35,从中任选28个数字,进行任意5个数字组合,共有多少种组合以及具体组合。谢谢
2个回答
展开全部
/*简化一下,从35个数字里任选7个数字,然后从剩下的28个数字中任选5个数字进行组合。
另外28取5是35取5的子集。如果你的问题是:
①需要所有的35取28,再做28取5组合的话,跟直接做35取5是没有区别的。
如果是:
②只做一次35取28的话,那就需要用随机数去掉7个,然后再做28取5做组合。
不知道你需要的是哪一个。如下是以②为例的代码,有不理解可追问*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ALLNUM 35
#define SELNUM 28
int main()
{
FILE * fp;
fp = fopen("comb.txt","w");
srand((unsigned)time(NULL));//随机数种子
int num[ALLNUM], i;
int i1,i2,i3,i4,i5;
for(i = 0; i < ALLNUM; i++)
num[i] = i + 1;
for(i = 0; i < 7; i ++)//随机数,如果是①的话此循环可去掉
{
//为节省效率此处使用末位回填,如需要保持原有顺序需改为后段整体前移
num[rand()%(ALLNUM-i)] = num[ALLNUM-i-1];
}
//注意组合不是排列,不可有重复数字,选第n个数字的时候要从第n-1个数字的后面开始
//如果是①的话SELNUM要换成ALLNUM
for(i1 = 0, i = 0; i1 < SELNUM; i1++)
for(i2 = i1+1; i2 < SELNUM; i2++)
for(i3 = i2+1; i3 < SELNUM; i3++)
for(i4 = i3+1; i4 < SELNUM; i4++)
for(i5 = i4+1; i5 < SELNUM; i5++)
{
i ++;
//由于屏幕输出太耗时间,这句先放在注释里面,验证的时候到同目录的comb.txt查看结果
//printf("%d %d %d %d %d\n",num[i1],num[i2],num[i3],num[i4],num[i5]);
fprintf(fp,"%d %d %d %d %d\n",num[i1],num[i2],num[i3],num[i4],num[i5]);
}
printf("一共%d种组合\n",i);//①的结果是324632,②的结果是98280
fclose(fp);
return 0;
}
另外28取5是35取5的子集。如果你的问题是:
①需要所有的35取28,再做28取5组合的话,跟直接做35取5是没有区别的。
如果是:
②只做一次35取28的话,那就需要用随机数去掉7个,然后再做28取5做组合。
不知道你需要的是哪一个。如下是以②为例的代码,有不理解可追问*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ALLNUM 35
#define SELNUM 28
int main()
{
FILE * fp;
fp = fopen("comb.txt","w");
srand((unsigned)time(NULL));//随机数种子
int num[ALLNUM], i;
int i1,i2,i3,i4,i5;
for(i = 0; i < ALLNUM; i++)
num[i] = i + 1;
for(i = 0; i < 7; i ++)//随机数,如果是①的话此循环可去掉
{
//为节省效率此处使用末位回填,如需要保持原有顺序需改为后段整体前移
num[rand()%(ALLNUM-i)] = num[ALLNUM-i-1];
}
//注意组合不是排列,不可有重复数字,选第n个数字的时候要从第n-1个数字的后面开始
//如果是①的话SELNUM要换成ALLNUM
for(i1 = 0, i = 0; i1 < SELNUM; i1++)
for(i2 = i1+1; i2 < SELNUM; i2++)
for(i3 = i2+1; i3 < SELNUM; i3++)
for(i4 = i3+1; i4 < SELNUM; i4++)
for(i5 = i4+1; i5 < SELNUM; i5++)
{
i ++;
//由于屏幕输出太耗时间,这句先放在注释里面,验证的时候到同目录的comb.txt查看结果
//printf("%d %d %d %d %d\n",num[i1],num[i2],num[i3],num[i4],num[i5]);
fprintf(fp,"%d %d %d %d %d\n",num[i1],num[i2],num[i3],num[i4],num[i5]);
}
printf("一共%d种组合\n",i);//①的结果是324632,②的结果是98280
fclose(fp);
return 0;
}
展开全部
记不清是高中数学还是本科概率论了,错了别怪我,毕竟毕业几年了 。 如果排列顺序不同是一种,例如 12345 和54321 是一种的话,(组合 35 选 5)就行吧 (35 × 34 × 33 × 32 × 31) / (5 ×4 × 3 × 2),如果12345和54321 算两种, 那用排列就行吧 35 × 34 × 33 × 32 × 31 。 我觉着,选28是障眼法。 程序大概思路,做一个函数展示组合或排列的结果,然后两次取,35取28, 28取5 ,然后去掉重复的
更多追问追答
追问
组合数就是你说的,但是28不是,我的意思是1--35,共35个数字对吧。用C语言编写一个程序,可以从中任选28个数字,这28个数字再次选出5个数字,要求这五个数字的组合能看到。
举例要求的程序效果:
35任选出1,2,3,4,5,.........28
要求输出
1,2,3,4,5
1,2,3,4,6
、
、
、
这样的。谢谢
追答
一看你就是在写作业,哈哈。明白你的意思,
举个简单的例子 1~28 中取 3 个数字
int in[28] = {1,2,3,4,5, 一直到 28} ;
int i = 1 ;
int j = 1 ;
int k = 1 ;
for( i = 1 ; i < 29 ; i ++ )
{
for( j = 1; j < 29 ; j ++ )
{
for( k = 1 ; k < 29 ; k ++ )
{
if( j != i && k != i && j != k )
{
printf( "%d %d %d", in[i], in[j], in[k]);
}
}
}
}
这个是一种正向的实现,你可以费劲的改一下,取3个是3层循环,取5个就是5层循环,而且 if中的判断是一大串。35选28,就随便选吧,直接放到初始in数组中就行。
我觉着用递归可能能更简单的实现,不过现在这个时间真懒得想了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询