1. 在c語言中怎麼設計排列組合的演算法呢(請勿百度演算法給我謝謝,我想知道怎麼想得到這個演算法)謝謝!
採用遞歸思路:假設有A1,A2,A3...An種元素
排列:
(1)把所有元素作為一個集合,可以拆分為一個元素+剩餘元素的子集合,有n種拆法(A1/剩餘元素,A2/剩餘元素...An/剩餘元素)
(2)把第一步中的子集合,按照(1)的思路進一步拆分,直到滿足(3)
(3)當子集合中只有1種元素時,此時為Ax/Ay,排列就只有兩種:Ax+Ay和Ay+Ax
組合:計算出排列後,組合就是:判斷新生成的排列方案與之前的排列方案是否為同一種組合,比如Ax+Ay與Ay+Ax是不同的排列、是相同的組合
2. c語言 排列組合 程序演算法
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(n0)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';//這個不用說啦。 printf("\n%d 位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i);return 0;}
3. 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
4. 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);
}
5. 用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下測試通過。
6. 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;
}
7. 用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 ;
}
8. 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);
}
9. c語言編程排列組合
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(n0)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';//這個不用說啦。
printf("\n%d 位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i);return 0;}
以上回答你滿意么?