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);
把这个加到循环里面就行了
蓬背人参: 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();//输出排序后的...