已知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型的范围,导致了整形数据的溢出。
分享到:
相关推荐
极值问题。m、n为整数,且满足下列两个条件:①m、n∈{1,2...编一程序,由键盘输入K,求一组满足上述两个条件的m、n,并且使m2+n2的值最大。例如,若K=1995,则m=987,n=1597,则m、n满足条件,且可使m2+n2的值最大。
求正整数n的不同划分个数。 例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。 Input 输入包含n+1行; 第一行是一个整数n,...
已知有n中物品和一个可容纳M质量的背包,每种物品i的质量为Wi,假定将物品i放入背包,可以得到Pi的效益,求使背包中物品总效益最大的背包方案。 实验方法: 找出成本函数,根据成本函数进行算法设计。给出分支—...
# 题目: # 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
编写程序实现对M位学生的N门课程成绩进行统计分析,要求:(1)统计出每个学生的总分、平均分及单科最高分;(2)统计出每门课的平均分、最高分;(3)统计出所有学生的最高总分与最高平均分;(4)统计出所有学生总...
1.从键盘上为一个5*5的整型数组输入数据,并找...编写程序,要求输入某班N名同学的序号及3门课成绩,计算每位同学的平均成绩以及每门课的平均成绩(学号为3位整数,成绩也为整数,课程名称为:科目1、科目2、科目3)。
试编写一段递归子程序计算ackermann函数ACK(m,n)。对于m≥0和n≥0的ACK(m,n)函数定义如下: ACK(0,n)=n+1 ACK(m,0)=ACK(m-1,1) ACK(m,n)=ACK(m-1,ACK(m,n-1)) 程序要求: ⑴ m、n在主程序从键盘输入,输入错误显示...
绳子的长度 题目描述 我们有n条长度不一的绳子。...随后n个正整数,表示最初绳子的长度() 输出格式 每组输出一行结果,表示切割后绳子的最长长度(保留两位有效数字) 样例输入 5 5 12 6 3 7 8 样例输出 6.00
5.15 数据段中已定义了一个有N个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 5.16 在首地址为DATA的字数组中,存放了100H个16位...
数据结构 一、编程题(请在以下题目中任选2题作答,每题30分,共60分) 1) 程序编写题 对于二维整数数组A[m][n],对下列三种情况,分别编写相应的函数。 1. 求数组所有边缘元素的数值和。 int sum1(int A[M][N],int ...
C语言程序设计-求一个n位自然数的各位数字的积;(n 是小于10的自然数).c
已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。 输入 第一行为M,表示测试数据组数。 接下来M行,每行包含一个测试数据。 输出 输出M行,每行为对应行的n-1位数...
算法课本的题目,要求复杂度是(nlgn)。
现在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x 满足: 1. x 和a0 的最大公约数是a1...
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从下一个人开始重新从1开始报数,如此下去,直至所有人全部出列为止。...
问题描述: 子集和问题的一个实例为〈S,t...接下来的1 行中,有n 个正整数,表示集合S 中的元素。 结果输出: 程序运行结束时,输出子集和问题的解输。当问题无解时,输出“No Solution!”(solution开头是大写)。
以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 实现要求: ⑴ 实现一个以链表作存储结构的栈类型,然后编写...
(1) 根据下述情况,分别编写程序,记录 BX 中 1 的个数(需要考虑 BX 中二进制 串的特殊情况),要求如下: 循环次数已知 循环次数未知 (2) 按照下列要求,编写相应程序段。 1) 起始地址为 string 的主存...
已知平方根迭代公式,设x=a/2。编写程序输入a值计算其平方根。迭代的结束条件是x n+1-xn。(平方根迭代公式为x n+1=(xn+a/xn)/2)
C语言程序设计-求1到100之间的偶数之积;.c