组合的编程
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);
}
