c语言 排列组合

作者&投稿:逮文 (若有异议请与网页底部的电邮联系)
在C语言中,如何输出一组数的排列组合~

#include
#include int n = 0;void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("
");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;//输入自然数的个数
printf("请输入连续自然数的个数:");
scanf("%d",&k);int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++)
{
list[i] = i + 1;
}
// int list[] = {1, 2, 3, 4, 5};
perm(list, 0, k-1);
printf("total:%d
", n);return 0;
}该程序的输入为一个任意自然数n,将输出从1到n的全排列。

扩展资料:C语言的基本数的排列法
1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
#include
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);

//接下来进行排序
for(i=0;i<n-1;++i)//n个数,总共需要进行n-1次
{ //n-1个数排完,第一个数一定已经归位
//每次会将最大(升序)或最小(降序)放到最后面
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])//每次冒泡,进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(j=0;j<n;++j)
printf("%-5d ",a[j]);
printf("

");
}

return 0;
}
2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。
#include
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf("

");
}

return 0;
}

#includeint com(int m,int n)//m中取n个{int i,j,sum=1;for (i=m,j=0;j<n;j++,i--){sum=sum*i/(j+1);}return sum;}int main(){int i;i=com(5,3);printf("%d",i);return 0;}

22个汉字全排列

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

#define ISPRINT
#define MAX 100

unsigned int *_NUM;
char *_NUMFLAG;

#define NUM(j) (*(_NUM+(j)))
#define NUMFLAG(j) (*(_NUMFLAG+(j)))
#define NUMUSE(j) (*(_NUMFLAG+(*(_NUM+(j)))))

void main()
{
char s[22][3] = {"想","恨","忍","真","我","爱","你","情","没","今","世","一","在","生","活","为","有","乐","好","不","快","过"};
unsigned int number = 3,j;
int i;

_NUM=(unsigned int*)malloc(sizeof(unsigned int)*number);
if(!_NUM){puts("alloc memory error.");exit(-1);}
_NUMFLAG=(char*)malloc(sizeof(char)*number);
if(!_NUMFLAG){puts("alloc memory error.");exit(-1);}

for(i=0;i<number;i++)NUM(i)=i,NUMFLAG(i)=1;

do{

#ifdef ISPRINT
for(j=0;j<number;j++)printf("%s",s[NUM(j)]);
puts("");
#endif

NUMUSE(number-1)=0;

for(i=number-2;i>=0;i--){
NUMUSE(i)=0;
if(NUM(i)<NUM(i+1))break;
}

if(i<0)break;

for(j=NUM(i)+1;j<number;j++){
if(!NUMFLAG(j))break;
}

NUMFLAG(j)=1;
NUM(i)=j;

for(j=0,i++;i<number;j++)
if(!NUMFLAG(j))NUM(i++)=j,NUMFLAG(j)=1;
}while(1);

free(_NUM);
free(_NUMFLAG);

}

FILE *fp;
if (fp=fopen("log.txt","a")==NULL)
{
printf("cannot open this file\n");
exit(0);
}
fread(buffer,44,1,fp);
把这个加到循环里面就行了


右玉县13222208868: C语言如何实现任意数排列组合,新手求助,急 -
蓬背人参: 1. 求排列组合没有简单方法.方法只有一个,枚举. 2. 有几个位置需要列举,就需要几个循环.如果循环数量太多,可以用函数递归来枚举. 例程: 1 2 3 4 5 6 7 8 9 10 11 12 13#include<stdio.h> intmain(){inta[4]={1,3,4,7}; //第一个位置...

右玉县13222208868: 用c语言怎么实现排列组合啊?比如从100个数里面任意选出5个数,即C100 5…… -
蓬背人参: #include<stdio.h> void main() {int n = 100;int m = 5;int n1 = 1, m1 = 1;for(int i = 1; i <= m; i++){n1 *= n - i + 1;m1 *= i;}n1 = n1/m1;printf("C100 5 = %d\n",n1); } 从n中选出m个,只要改变n和m的值即可,VS2010下测试通过.

右玉县13222208868: 用C语言 编写程序输入一个整数,输出从1到这个整数的所有排列组合. 样例一: 输入:3 -
蓬背人参: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34#include <stdio.h> ints[1000]; voidf(inta[],intlen,intn) {if(!n){for(inti=0;i<len-1;i++){printf("%d ",s[i]);}printf("%d\n",s[len-1]);}for(inti=0;i<len;...

右玉县13222208868: C语言组合算法 -
蓬背人参: 排列组合的公式数学里有组合的公式是nCm=n!/(m!(n-m)!) 但是排列组合的计算式子快捷方法不是这么做的n*(n-1)……*(n-m+1)/m*(m-1)……*1设两个循环 #include<stdio.h> void main{ int a=1; int b=1; int c; for(i=N;i>N-M;i--) {a=a*i; } for(i=M;i>0;i--) {b=b*i; }c=a/b; }

右玉县13222208868: 用C语言编写一个排列组合的程序
蓬背人参: #include<stdio.h> int a[5]; int len1,len2,len3; void input(int len1,int len2,int len3) { printf("%d %d %d\n",a[len1],a[len2],a[len3]); } void solve(int len1,int len2,int len3) { input(len1,len2,len3); if(len1==2) return; if(len3<4) len3++; else if(len2<3) { len2+...

右玉县13222208868: 用C编程排列组合 -
蓬背人参: #include <stdio.h> #define MAX_NUM 26 char ach15Char[6] ="12345"; // 一定要有序的! int comb[MAX_NUM]; void combination(int m, int n) {int i, j;for (i = m; i >= n; i--){comb[n] = ach15Char[i-1]; /* 选择当前的“头”元素 */if (n > 1)...

右玉县13222208868: 怎么用C语言进行排列?比如,1到6 六个数,输出所有可能的组合 -
蓬背人参: 刚回答了一个组合的,现在是排列62616964757a686964616fe78988e69d8331333337386639的.方法类似,采用递归方法.void CopyArrayWithExcept(int a[], int nCount, int b[], int nExcept) { for(int i=0, j=0; i<nCount; i++) { if(i != nExcept) { b[j+...

右玉县13222208868: c语言 排列组合 -
蓬背人参: 22个汉字全排列#include<stdio.h>#include<stdlib.h>#define ISPRINT#define MAX 100 unsigned int *_NUM; char *_NUMFLAG;#define NUM(j) (*(_NUM+(j)))#define NUMFLAG(j) (*(_NUMFLAG+(j)))#define NUMUSE(j) (*(_NUMFLAG+(*(_NUM+(j))...

右玉县13222208868: C语言中的排列组合问题; -
蓬背人参: f(m, n)表示m个黑球n个白球的排法,那好.假如这个问题给你了,你会这样想:1、我先把第一位放黑球,那么后面的排法有多少种:当然是f(m - 1, n)种,因为少了一个黑球.2、同理,我先放白球,那么有f(m, n - 1)种.总共就有f(m-1,n)+f(m,n-1)种,后面就递归了.但不能无限递归,需要指定界限,然后就有if(m==0||n==0) return 1; 这个和数学归纳法很相似.

右玉县13222208868: C语言中如何对一组数进行排列 -
蓬背人参: #include "time.h" #include "stdio.h" #include "stdlib.h"int aa[100]; int bb[100]; void main() {void ReadDat();//随机产生100个学生成绩存放到数组aa中,随机产生100个相应的学号存放到bb数组中void WriteDat();//输出排序后的...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网