#include<stdio.h>
unsigned long f(unsigned short m, unsigned short n);
unsigned long Fact(unsigned short k);
int main()
{
/* 考虑到用户可能输入负数, 将m、n声明为short类型更稳妥 */
/* 虽然f函数的两个参数均为unsigned short类型, 但实际最大值 = short类型的最大正数值 */
short m;
short n;
/* 考虑到排列数可能较大, 用unsigned long类型声明更合适 */
unsigned long result;
/* 输入容错机制 */
while(scanf("%hd%hd", &m, &n) != 2 || m < 1 || n < 0)
{
while(getchar() != '\n') ;
printf("请输入合法数据.\n");
}
result = f(m, n) / Fact(n);
if(result != 0)
{
printf("C(%hd, %hd) = %lu.\n", m, n, result);
}
else
{
/* 数据不合法 */
printf("C(m, n): m >= n!\n");
}
/* */
return 0;
}
/* 计算A(m, n) */
unsigned long f(unsigned short m, unsigned short n)
{
/* 数据不合法 */
if(n > m)
{
return 0;
}
/* */
unsigned long S = 1;
/* S = m * (m - 1) * (m - 2) * ... * (m - n + 1) */
unsigned short i = m;
while(i >= m - n + 1)
{
S *= i;
i --;
}
/* 有趣的是, 如果n == 0, 那么循环一次都不执行, 最终结果确实也为1 */
return S;
}
/* 计算k的阶乘 */
unsigned long Fact(unsigned short k)
{
unsigned short i = k;
unsigned long S = 1;
while(i >= 1)
{
S *= i;
i --;
}
/* 有趣的是, 如果k == 0, 那么循环一次都不执行, 最终结果也为1 */
return S;
}