现在的位置: 首页 > 综合 > 正文

已知m,n是正整数,编写程序求m中取n的组合数

2017年12月14日 ⁄ 综合 ⁄ 共 1103字 ⁄ 字号 评论关闭

已知m,n是正整数,编写程序求m中取n的组合数

源程序:

#include<stdio.h>

long fac(int k)                         // k 为形式参数,简称形参,它用于接受主调函数中的变量的值long指明了函数的返回值(在这里也

{                                                    就是p)的类型是长整形。因为主调函数中c的类型是长整形。
     
long p;

      int i;                                    //i是局部变量,只在本函数中起作用

      p=1;

      for(i=1;i<=k;i++)              // k的值不同,就可以求不同整数的阶乘

      p=p*i;

      return p;                           //被调函数返回p的值给主调函数,p称为被调函数的返回值

}

main()                                  

{

     int m,n;

     long c;

     printf("请输入m与n的值:");

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

     c=fac(m)/(fac(n)*fac(m-n));                              //调用fac函数,这时被调函数的返回值就派上用场了

     printf("m中取n的组合数为%ld\n",c);

}

结果:


注:

1.这种由多个函数构成的程序,其执行流程是怎样的呢?这种程序总是从主函数开始执行,当遇到被调函数时,它会转到被调函数中执行,然后执行到return,带着return的结果再回到主函数来。

2.如果被调函数在主函数的下方,那么在主函数的上方必须要有一个函数声明,例如在这个程序中,如果我们把long fac(int k)放到main的下面,则必须在main的上面写一条long fac(int k);这就是函数声明,它的作用是告诉编译器,这个程序会用到这个函数。编译器在执行main函数时,如果遇到被调函数,它会想:咦,这个东西好面熟,再往下找找吧。这样就转向被调函数了。

3.参数的传递实际上是一种赋值运算

4.实参必须有确定的值

5.形参必须指定类型,只能是变量

6.实参和形参个数相等,类型一致(类型相同或赋值兼容)

执行这个程序时一定要慎重,一不小心就会超出范围,例如输入20和1,结果是-19,这个问题也让我纠结了很久,后来觉得应该是20的阶乘数值太大,超出了long型的范围,导致了整形数据的溢出。



抱歉!评论已关闭.