組合的編程
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;}
以上回答你滿意么?
② 排列組合C語言編程思路
定義一個結構體一維數組,每個下標表示不同的盒子
{int A;
int B;
int C;
int D;
}
,先窮舉A的可能性
再依次窮舉B、C、D的可能性
最後輸出
③ 計算組合數 如何編程
如果是指從m個不同元素中取出n(n≤m)個元素的所有組合的個數 的話
#include"stdio.h"
int fac(int n) /*階乘函數*/
{
int s,i;
s=1;
for(i=1;i<=n;i++)
{
s*=i;
}
return(s);
}
main()
{
int n,m,c;
scanf("%d %d",&m,&n);
c=fac(m)/(fac(n)*fac(m-n));
printf("%d\n",c);
}
用的是C語言
④ 怎麼編程實現排列組合
publicstaticStringreverse1(Stringstr)
{
returnnewStringBuffer(str).reverse().toString();
}
2.最常用的方法:
publicstaticStringreverse3(Strings)
{
char[]array=s.toCharArray();
Stringreverse="";//注意這是空串,不是null
for(inti=array.length-1;i>=0;i--)
reverse+=array[i];
returnreverse;
}
3.常用方法的變形:
publicstaticStringreverse2(Strings)
{
intlength=s.length();
Stringreverse="";//注意這是空串,不是null
for(inti=0;i<length;i++)
reverse=s.charAt(i)+reverse;//在字元串前面連接,而非常見的後面
returnreverse;
}
4.C語言中常用的方法:
publicstaticStringreverse5(Stringorig)
{
char[]s=orig.toCharArray();
intn=s.length-1;
inthalfLength=n/2;
for(inti=0;i<=halfLength;i++){
chartemp=s[i];
s[i]=s[n-i];
s[n-i]=temp;
}
returnnewString(s);//知道char數組和String相互轉化
}
⑤ 排列組合編程問題
這個程序是求n的月之數,程序直接給出答案是1<<(n-1))+(n-1)*(1<<(n-2))。
C語言里1<<x等於2的x次方,所以這個答案很容易看出來其實是2^(n-1)+(n-1)*2^(n-2),^是乘方運算。
下面給出上式的推導過程:
因為最高的一位必然為1,所以位數為n的二進制數的個數為2^(n-1)個(這是很基本的,你要是連這個都不知道為什麼我就沒啥好說了)。
一、只考慮最高位,所有的數都是1,所以一共有2^(n-1)個1。
二、不考慮最高位,一共有(n-2)位。以最低位為例,所有數中,有一半最低位是0,另一半最低位是1,所以只考慮最低位時,一共有2^(n-1) / 2 = 2^(n-2)個1。同理,只考慮除了最高位的剩下的n-2位中的任意一位時,所有數中一共有2^(n-2)個1。這樣加起來有(n-2) * 2^(n-2)個1。
綜合一二可知,n的月之數為2^(n-1)+(n-1)*2^(n-2)。即1<<(n-1))+(n-1)*(1<<(n-2))。
⑥ 排列組合編程
我承認我錯了,是120種
我這種方法還算巧妙吧:
#include <stdio.h>
int main()
{
int i,j,k;
int sum = 0;
for(i = 9; i>=2;i--)
for(j = i-1; j >=1; j--)
for(k = j-1; k>=0;k--)
printf("%d%d%d\n",i,j,k);
return 1;
}
文本,你去抄下書就搞定了
⑦ 用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)
{
/* 進入下一次更小的組合問題 */
combination( i - 1, n - 1);
}
else
{
/* 滿了需要的組合數,輸出 */
for (j = comb[0]; j > 0; j--)
{
printf("%c", comb[j]);
}
printf("\t");
}
}
return;
}
int main(int argc, char *argv[])
{
comb[0] = 3;
combination( 5, comb[0]); /* C(15, 7) */
return 0;
}
⑧ 編程中排列組合的問題(4個數字中(數字范圍0-9),每3個為一組,允許數字重復使用,求所有組合)
從4個數字中取3個數,且能重復選用。所以每取一位都有4種選擇,共有4³=64個數
⑨ 一個排列組合的編程問題
其實去取那五個不連續的數相對簡單點,然後在從全部數字當中去除取出的那幾個數字,剩下的就是我們要存到文件的了。
現在,問題就變成了:1~14中取5個不連續的數字。簡單點,我們拿1~8取3個不連續的數來舉例子:
1 3 5
1 3 6
1 3 7
1 3 8
1 4 6
1 4 7
1 4 8
1 5 7
1 5 8
1 6 8
2 4 6
2 4 7
2 4 8
2 5 7
2 5 8
2 6 8
3 5 7
3 5 8
3 6 8
4 6 8
發現規律了嘛?程序如下^_^
<SCRIPT LANGUAGE="VBS">
'''''''''''''''''''''''''
Sub q (n, max_n, v, max_v)
For i=v To max_v
b(n)=i
If n<max_n Then
call q (n+1, max_n, i+2, max_v)
Else
For j=1 To max_v
ary(j)=j
Next
For j=1 To max_n
ary(b(j))=0
Next
For j=1 To max_v
If ary(j)>0 Then document.write (cstr(ary(j))+" ")
Next
document.write ("<br>")
c=c+1
End If
Next
end Sub
'''''''''''''''''''''''''
Dim b(5)
Dim ary(14)
call q (1,5,1,14)
</SCRIPT>
代碼用VB Script寫的,可以直接存為html文件在瀏覽器里執行。vb和vbs語法一致,只是,輸出部分要改為文件操作,忘冰兄弟就自己辛苦點,獨立完成餘下的部分吧。
加油!
⑩ C語言中組合公式的編程
int function(int n,int m)
{
int i, ret = 1;
for(i=0;i<m;i++)
ret *= (n-i);
return ret;
}
void main(void)
{
int n = 15, m =5;
int ret;
ret = function(15,5) / function(5,5);
printf("%d\n",ret);
}
