当前位置:首页 » 编程语言 » 用c语言算组合
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

用c语言算组合

发布时间: 2022-04-25 10:53:14

Ⅰ 用c语言编程,求组合数!

#include <stdio.h>
void main()
{
void choose(int a,int b);
int a,b,c,d;
printf("请输入两个整数,以0,0结束\n");

scanf("%d,%d",&a,&b);
scanf("%d,%d",&c,&d);
if(c==0&&d==0)
choose(a,b);
}
void choose(int a,int b)
{
if(b>a)
{
printf("error!");
}
else
{
int fenmu=b,fenzi=a;
for(int i=a-1;i>a-b;i--)
fenzi*=i;
for(int j=b-1;j>1;j--)
fenmu*=j;
int temp;
temp=fenzi/fenmu;
printf("%d",temp);
}
}

Ⅱ C语言求组合数

doublefact(longnum)
{
for(longi=1;num>0;num--)
{
i*=num;
}
}

intmain()
{
longm;
longn;
longC;

scanf("%ld%ld",&m,&n);

C=fact(n)/((fact(m))*fact(n-m));

printf("%ld",C);

return0;
}

Ⅲ 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;
}

Ⅳ C语言如何实现任意数排列组合,新手求助,急

  1. 求排列组合没有简单方法。方法只有一个,枚举。

  2. 有几个位置需要列举,就需要几个循环。如果循环数量太多,可以用函数递归来枚举。

    例程:

    #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语言

如果是指从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语言 排列组合 程序算法

#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语言,如何求n个元素的m个组合

//你是求元素排列组合吧,我这里用的是3个元素
#include<stdio.h>
#defineN3
voidsort(inta[]);
intmain(void)
{
inta[N]={1,2,3};
sort(a);
return0;
}
voidsort(inta[])
{
for(inti=0;i<N;++i)
{
for(intj=0;j<N;++j)
{
if(j==i)
continue;
else
for(intk=0;k<N;++k)
{
if(k==i||k==j)
continue;
else
printf("%d,%d,%d ",i,j,k);
}
}
}
}

Ⅷ 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=&num;//计数器 地址。 p[n]='\0';//这个不用说啦。 printf("\n%d 位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i);return 0;}
以上回答你满意么?

Ⅸ 用C语言求组合数

实现的算法很多, 下面给出一个不需要递归的算法; 需要设计两个函数。
unsigned long factorial (unsigned long n);
long long perm(unsigned long m, unsigned long n);

unsigned long factorial (unsigned long n)
{
unsigned long value = (n == 0) ? 1 : n;
while( n >= 2 )
value *= --n;

return value;
}

long long perm(unsigned long m, unsigned long n)
{
if (m > n)
return -1;
else
return (unsigned long) (factorial(n)/factorial(n-m));
}

只为了m>n就要返回-1, 有点浪费啊~~~
注意求值范围, 如果需要可以int64扩展。。。

Ⅹ 在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的全排列。

(10)用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;

}