❶ c語言如何實現排列組合的程序
void nn(char c,char cc[])
{//對於有重復的數據這就不行了
//雖然可以都列出來,中間有重復的可能
char tmp,*qc;
if(c=='#')printf("%s",cc);
else {
for(qc=c;qc!='#';qc++){
tmp=*c;
*c=*qc;
*qc=tmp;
cc++;
nn(qc,cc);
cc--;
tmp=*c;
*c=*qc;
*qc=tmp;
}
}
}
main()
{
char cc[100];//請以#結束
scanf("%s",&cc);
nn(cc,cc);
}
❷ c語言 排列組合 程序演算法
#include<stdio.h>
#include<string.h>
void
Show(int
n,int
len
,char
str[],
char
p[],int
*i)
{
/*函數功能說明: 密碼窮舉法
遞歸演算法
參數說明:
len
密碼可選元素的個數,實際等於
strlen(str);
n
密碼位數。
STR[]密碼表。
*p
密碼排列組合的臨時存檔
*/
int
a;
n--;
for(a=0;
a
<
len;
a++)
{
p[n]=str[a];
if(n==0)printf("%d:%s
",(*i)++,p);
if(n>0)Show(n,len
,
str,p,i);
}
} /*驅動程序
用於測試*/
int
main(void)
{
char
str[]="abcdef";//密碼表
可選元素集合可根據選擇修改
int
n=4; //密碼位數,根據具體應用而定。
int
len=strlen(str);//用於密碼元素集合計數。
char
p[20]; //存放排列組合的密碼,用於輸出。
int
num=0;//存放統計個數的整數值,
int
*i=#//計數器
地址。
p[n]='\0';//這個不用說啦。 Show(
n,len
,str,
p
,i);
printf("\n%d
位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i); return
0;
}
❸ 用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下測試通過。
❹ 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)))))
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);
}
❺ 有沒有C語言大神教教我怎麼編排列組合
比較簡單的做法是做一個求階乘的函數fac(n)
然後調用這個函數
C=fac(m)/(fac(n)*fac(m-n))
這個程序的缺點是效率不高,特別是只能求m在12以下的組合數(使用浮點型編寫函數可以提高上限)
❻ C語言 排列組合
發個C#的代碼:
int[] a = { 1 , 2 , 3 , 4 , 5 , 6 };
int weishu = 6;
int weishu2 = weishu - 1;
int zuida = (int)Math.Pow( 2 , weishu2 );
List<int[]> list = new List<int[]>();
for ( int i = 0 ; i < zuida ; i++ )
{
int[] b = (int[])a.Clone();
for ( int j = 0 ; j < weishu2 ; j++ )
{
int c = i >> j;
if ( (c & 1) == 1 )
{
int tmp = b[ j ];
b[ j ] = b[ j + 1 ];
b[ j + 1 ] = tmp;
}
}
list.Add( b );
}
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine( string.Format( "共 {0} 個結果" , list.Count ) );
foreach ( int[] aa in list )
{
for ( int i = 0 ; i < aa.Length ; i++ )
{
sb.Append( aa[ i ] );
if ( (i & 1) == 1 )
sb.Append( '\t' );
}
sb.AppendLine();
}
Console.WriteLine( sb.ToString() );
運行結果:
共 32 個結果
12 34 56
21 34 56
13 24 56
23 14 56
12 43 56
21 43 56
13 42 56
23 41 56
12 35 46
21 35 46
13 25 46
23 15 46
12 45 36
21 45 36
13 45 26
23 45 16
12 34 65
21 34 65
13 24 65
23 14 65
12 43 65
21 43 65
13 42 65
23 41 65
12 35 64
21 35 64
13 25 64
23 15 64
12 45 63
21 45 63
13 45 62
23 45 61
❼ 用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++;
len3=len2+1;
}
else if(len1<2)
{
len1++;
len2=len1+1;
len3=len2+1;
}
solve(len1,len2,len3);
}
void main()
{
int i;
for(i=0;i<5;i++) a[i]=i+1;
printf("所構成組合是:\n");
solve(0,1,2);
return ;
}
❽ 在C語言中,如何輸出一組數的排列組合
#include <stdio.h>
#include <stdlib.h>
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的全排列。
(8)排列組合c語言該怎麼寫擴展閱讀:
C語言的基本數的排列法
1、冒泡排序:每次相鄰兩個數比較,若升序,則將大的數放到後面,一次循環過後,就會將最大的數放在最後。
#include <stdio.h>
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 <stdio.h>
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;
}
❾ C語言如何實現任意數排列組合,新手求助,急
求排列組合沒有簡單方法。方法只有一個,枚舉。
有幾個位置需要列舉,就需要幾個循環。如果循環數量太多,可以用函數遞歸來枚舉。
常式:
#include<stdio.h>
intmain(){
inta[4]={1,3,4,7};//第一個位置
intb[4]={2,5,8,10};//第二個位置
intc[4]={6,9,11,12};//第三個位置
inti,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++)
printf("%d%d%d ,",a[i],b[j],c[k]);//輸出一種排列
getch();
return0;
}
❿ 用C語言編寫一個排列組合的程序
#include<cstdio>看代碼,應該好懂的吧
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
usingnamespacestd;
intf[4]={0,1,2,3};
charch[4][10]={"a2b8","5a8f","b9ec","5c2f"};
intmain()
{
inti,j,k;
for(i=0;i<24;i++)//共4!個排列
{
for(j=0;j<4;j++)
printf("%s",ch[f[j]]);
printf(" ");
next_permutation(f,f+4);//下一個排列
}
return0;
}