C语言:for循环解决组合数问题
前言:从 n 个不同元素中每次取出 m 个不同元素
,不管其顺序合成一组,称为从 n 个元素中不重复地选取 m 个元素的一个组合。所有这样的组合的种数称为组合数。
那么我们如何用C语言进行运算呢?
解题思路: 首先要清楚阶乘定义,所谓 n 的阶乘,就是从 1 开始乘以比前一个数大 1 的数 一直乘到 n,用公式表示就是:1×2×3×4×…×(n-2)×(n-1)×n=n!
具体步骤:(以单个阶乘为例)利用循环,设循环变量为 i,初值为 1,i 从 1 变化到 m,依次让 i 与 sum_1 相乘,并将乘积赋给 sum_1
1.定义变量 sum_1,并赋初值 1 2.i 自增 1 3.直到 i 超过 m
#include<stdio.h>
int main()
{
/*思路
首先要清楚阶乘定义,所谓 n 的阶乘,就是从 1 开始乘以比前一个数大 1 的数
一直乘到 n,用公式表示就是:1×2×3×4×…×(n-2)×(n-1)×n=n!
*/
/*具体操作 (以m!为例)
利用循环,设循环变量为 i,初值为 1,i 从 1 变化到 m
依次让 i 与 sum_1 相乘,并将乘积赋给 sum_1
1.定义变量 sum_1,并赋初值 1
2.i 自增 1
3.直到 i 超过 m
*/
int m,n;
int i,j,k;
double sum_1,sum_2,sum_3;
sum_1=sum_2=sum_3=1;
double x;
scanf("%d %d",&m,&n);
for(i=1;i<=m;i++)
{
sum_1=sum_1*i;//求m的阶乘
for(j=1;j<=n;j++)
sum_2=sum_2*j;//求n的阶乘
for(k=1;k<=(m-n);k++)
sum_3=sum_3*k;//求m-n的阶乘
}
//为什么嵌套循环:题目说明了 m > = n > = 0,所以m 做外循环,n以及m-n 做内循环,分别去对应值
x=sum_1/(sum_2*sum_3);//题目要求的最终计算
printf("%.0lf",x);
}
