定义两个函数 分别输出m个数中n个数的排列 与组合

dendi-wang 2011-11-14 08:11:09
例如 1 2 3 这三个数 两个数的排列与组合
排列: 1 2; 1 3;2 1; 2 3;3 1;3 3;
组合:1 2; 1 3; 2 3;


跪求编程原理 注意 是原理啊 即使没有代码 也行!!! 我要的是方法!!1
...全文
522 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
安然 2012-06-11
  • 打赏
  • 举报
回复
argv[3]与argc[3]表示什么意思啊
wudi00008 2012-04-17
  • 打赏
  • 举报
回复
看看怎么样
赵4老师 2011-11-16
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m, int n)
{
int i, j;
for (i = m; i >= n; i--){
comb[n] = i; /* 选择当前的“头”元素 */
if (n > 1){
/* 进入下一次更小的组合问题 */
combination(i - 1, n - 1);
}else{
/* 满了需要的组合数,输出 */
for (j = comb[0]; j > 0; j--){
printf("%c", 65+c1-comb[j]);
}
printf("\n");
}
}
return;
}
int main(int argc, char *argv[])
{
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 0;
}
c1=atoi(argv[1]);
if (c1<1||26<c1) {
printf("1<=组合下标<=26\n");
return 0;
}
c2=atoi(argv[2]);
if (c2<1||c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 0;
}
comb[0]=c2;
combination(c1, c2); /* C(4, 2) */
return 0;
}

#include <stdio.h>
#include <stdlib.h>
int count = 0;
void permutation(char per[], int m, int len)
{
int i;
char tmp;
if (m < len - 1){
permutation(per, m + 1, len);
for (i = m + 1; i < len; i++){
/* 选当次的排列“头” */
if (per[m]==per[i]) continue;
tmp = per[m];
per[m] = per[i];
per[i] = tmp;
permutation(per, m + 1, len);
/* 恢复上一次的排列 */
tmp = per[m];
per[m] = per[i];
per[i] = tmp;
}
}else{
++count; /* 对排列进行计数 */
/* 调整一下格式 */
printf("%s\n", per);
}
return;
}
int main(int argc,char **argv)
{
if (argc<2) {
printf("%s 要排列的字符串\n",argv[0]);
return 0;
}
permutation(argv[1], 0, strlen(argv[1]));
printf("The total: %d" , count);
return 0;
}

将组合m,n的每个结果作为全排列的输入即可得到m,n的排列。
selooloo 2011-11-16
  • 打赏
  • 举报
回复
找本高中数学看看,有一章专门讲排列组合的
dendi-wang 2011-11-16
  • 打赏
  • 举报
回复
2L和3L给的是全排列和组合!!!
4L给力啊 原理是对的 代码容我慢慢看看 ....但是排列原理 你也会吗》? 求指导!!
zheng_jj 2011-11-14
  • 打赏
  • 举报
回复

/*
求(1...m)中,n个数的组合
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,
同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。

例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5
*/
#include <stdio.h>
#include <malloc.h>
//输出
void output(int *num, int m)
{
int i;
for(i = 0; i < m; ++i)
if(*(num+i) == 1)
printf("%d ", i+1);
printf("\n");

}
//检测n个“1”是否全部移动到最右端
//是则返回1
int check(int *num, int m, int n)
{
int i, flag = 1;
for(i = m-1; i > m-n-1; --i)
{
if(*(num+i) == 0)
{
flag = 0;
break;
}
}
return flag;
}
void chooseNum(int m, int n)
{
int *num, i, j, count;
num = (int*)malloc(sizeof(int)*m);
for(i = 0; i < n; ++i)//前n个元素置1
*(num+i) = 1;
if(m == n)
{
output(num, m);
return;
}
for(i = n; i < m; ++i)//后面m-n个元素置0
*(num+i) = 0;
output(num, m);
while(1)
{
count = 0;

//找到第一个“10”组合后将其变为“01”组合
for(i = 0; i < m-1; ++i)
{
if(*(num+i) == 1 && *(num+i+1) == 0)
{
*(num+i) = 0;
*(num+i+1) = 1;
break;
}
if(*(num+i) == 1)
++count;
}

//将其左边的所有“1”全部移动到数组的最左端
for(j = 0; j < i; ++j)
{
if(j < count)
*(num+j) = 1;
else
*(num+j) = 0;
}
output(num, m);
if(check(num, m, n) == 1)
break;
}
free(num);

}
int main()
{
int m = 3, n = 2;
//scanf("%d%d", &m, &n);
chooseNum(m, n);
return 0;
}
goldbeef 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]

C/C++ code

#include <stdio.h>
#include <stdlib.h>

bool find_arr( int a[], int length , int value )
{
for( int i = 0; i < length; ++i )
{
if( a[i] == value )
return true……
[/Quote]楼上正解,百度上很多啊,也可以看看算法导论
無_1024 2011-11-14
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

bool find_arr( int a[], int length , int value )
{
for( int i = 0; i < length; ++i )
{
if( a[i] == value )
return true;
}
return false;
}
int main()
{
int len;
int *arr;
int i = 0, j = 0;
printf("input the array numbers: ");
scanf("%d",&len);
arr = new int[len];
for( i = 0; i < len; ++i )
{
printf("input the %d number: ",i + 1);
scanf("%d",&arr[i]);
}
printf("排列:");
for( i = 0; i < len; ++i )
{
for( j = 0; j < len; ++j )
{
if( arr[i] != arr[j] )
{
printf("%d %d ;",arr[i],arr[j]);
}
}
}
printf("\n组合:");
for( i = 0; i < len; ++i )
{
for( j = i + 1; j < len; ++j )
{
printf("%d %d ;",arr[i],arr[j]);
}
}
printf("\n");
return 0;
}
ryfdizuo 2011-11-14
  • 打赏
  • 举报
回复
《概率论与数理统计》是理工科大学的一门重要基础课程,它结合了概率论的基本理论与统计学的方法,用于分析和处理随机现象。第二版的完整版多媒体教学系统旨在通过丰富的教学资源和互动体验,帮助学生深入理解和掌握这门学科的核心概念。 一、概率论基础 概率论是研究随机事件及其规律性的数学理论,主要包括以下几个关键概念: 1. 随机试验:概率论的研究对象,如掷骰子、抽卡等。 2. 样本空间:所有可能结果的集合。 3. 事件:样本空间的子集,代表某种特定的结果。 4. 概率:事件发生的可能性,通常介于0和1之间,表示为P(A)。 5. 条件概率:在已知某个事件发生的情况下,另一个事件发生的概率。 6. 乘法法则和加法法则:用于计算两个独立或不独立事件的概率。 二、概率分布 1. 离散概率分布:如二项分布、泊松分布、几何分布、超几何分布等,用于描述离散随机变量的分布情况。 2. 连续概率分布:如均匀分布、正态分布、指数分布等,适用于连续随机变量。 三、统计学基础 1. 参数估计:通过样本数据估计总体参数,如均值、方差等。 2. 抽样分布:统计量在多次重复抽样下的分布情况。 3. 点估计和区间估计:给出参数的一个估计值或一个估计范围。 4. 假设检验:检验关于总体参数的假设是否成立,如t检验、卡方检验、F检验等。 5. 回归分析:研究两个或多个变量间的关系,预测一个变量基于其他变量的值。 四、数理统计方法 1. 最大似然估计:寻找使样本数据出现概率最大的参数估计方法。 2. 矩估计:通过总体矩与样本矩的关系来估计参数。 3. 正态分布的心极限定理:大量独立随机变量的和近似服从正态分布,即使这些变量本身非正态。 4. 协方差和相关系数:衡量两个随机变量之间线性关系的强度和方向。 5. 方差分析(ANOVA):比较多个组别间的均值差异。 五、多元统计分析 1. 多元正态分布:多维空间的正态分布,常用于多元线性回归。 2. 判别分析:根据已知分类的样本数据,建立判别函数,对新数据进行分类。 3. 聚类分析:将相似数据分组,揭示数据内在结构。 4. 主成分分析(PCA):降低数据维度,提取主要特征。 六、多媒体教学系统 该教学系统可能包含以下组成部分: 1. 视频讲座:专家讲解理论和例题,直观展示概念。 2. 动画演示:动态模拟随机过程,帮助理解概率模型。 3. 交互式练习:提供习题和答案,实时反馈学习效果。 4. 实验教程:设计数学实验,让学生亲手操作,加深理解。 5. 电子教材:包含文字、图表、案例等丰富内容,便于自主学习。 通过这个多媒体教学系统,学生不仅可以学习到概率论与数理统计的理论知识,还能通过实践应用和互动学习,提升解决实际问题的能力。

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧