c语言编程题:有n个物品各不相同,现从中抽取t个(1<=t<=n),输出所有可能的取法

2025-04-05 01:50:51
推荐回答(4个)
回答1:

使用递归来做。从后往前选取,选定位置i后,再在前i-1个里面选取t-1个

#include 
#include 
#include 

void Pick(int* arr, int nLen, int m, int* out, int outLen)
{
if(m == 0)
{
for (int j = 0; j < outLen; j++)
printf("%d\t",out[j]);
printf("\n");
return;
}

for (int i = nLen; i >= m; --i)
{
out[m-1] = arr[i-1]; 
Pick(arr,i-1,m-1,out,outLen);
}
}

void PickAll(int *arr, int nLen, int m)
{
if(m > nLen)
return;

int* out = (int*)malloc(sizeof(int) * nLen);
Pick(arr,nLen,m,out,m);
free(out);
}

int main(void)
{
int buf[5]={1, 2 , 3, 4,5 };
PickAll(buf, 5, 3);
return 0;
}

回答2:

#include

int n;
int m;
int num = 0;
 
void comb(int *a, int h, int k, int *sub)
{
if(k == 0)
{
for(int i = 0; i < m-1; i++)
{
    printf("%d,",sub[i]);
//cout << sub[i] << ",";
}
printf("%d\n",sub[m-1]);
//cout << endl;
num ++;
}
else
{
for(int i = h-1; i >= k-1; i--)
{
sub[k-1] = a[i];
comb(a, i, k-1, sub);
}
}
}
 
int main()
{
int n;
scanf("%d%d",&n,&m);
//cin >> n >> m;
int a[100], sub[100];
for(int i = 0; i < n; i++)
{
a[i] = i+1;
}
comb(a, n, m, sub);
printf("一共有%d种方案\n",num);
//cout << num << endl;
return 0;
}

回答3:

#include
#include
uint64_t fact(int n)
{
    uint64_t res = 1;
    for(int i = 1; i <= n; i++)
        res *= i;
    return res; 
}
int main()
{
    int n, t;
    scanf("%d%d", &n, &t);
    uint64_t res = fact(n)/(fact(t)*fact(n-t));
    printf("%llu", res); //msvc中使用%l64u
    return 0;
}

回答4:

#include  
int i, n, m; 
double n1, m1, o1; 
printf("Enter m and n (m<=n):"); 
scanf ("%d%d",&m, &n); 
n1=fact(n); 
m1=fact(m); 
o1=fact(n-m); 
printf ("The result is %f" , n1/(m1*o1)); 
double fact(int n){
int i;
double product;
product = 1;
for(i=1;i<=n;i++){
 product = product * i;
}
return product;

}