问题 问答题

编写函数fun,其功能是:根据以下公式求p的值,结果由函数值返回。m与n为两个正整数,且m>n。


例如:m=12,n=8时,运行结果为495.000000。
注意:部分源程序在文件PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
文件PROG1.C内容如下:
#include<stdio.h>
double fun(int m,int n)


void main( )
printf("P=%f\n",fun(12,8));

答案

参考答案:double fun(int m,int n){
(touble p,s=1,s1,s2,s3;
int i:
for(i=1;i<=m;i++){
s=s*i:
if(i==n1)s1=s;
if(i==n)s2=s;
if(i==m-n)s3=s;
}
p=s1/(s2*s3);
return p;

解析:
本题考的是循环累乘算法。根据要求分别求出m!赋值给s1,n!赋值给s2,(m-n)!赋值给s3,再根据公式返回s1/(s2+s3)的值即可,所以问题的关键在于怎样求阶乘。可以通过一个简单的循环实现累乘算法,当i循环到m-n、n和m时,将中间结果s分别赋值给相应的变量s1、s2、s3,跳出循环后返回s1/(s2+s3)的结果。
[归纳总结]
本套试题的程序填空和程序设计题考查的是循环累加、累乘、累除算法。这是等级考试中的常见算法,通常是对一些数学公式进行一定的处理。此类题目的处理方法是:首先分析数学公式的总体规律是循环累加还是循环累乘,然后再判断每一项的变化规律,即后一项是在前一项的基础上发生了怎样的规律性变化,求出每一项后再累加或累乘到最后的变量中。
常用的累加算法程序是:
double fun(int n){
int i:
double s=0, t=1;
for(i=1;i<=n;i++){
t=t*______;/*求出累加的这一项,横线部分根据具体公式中每一项的变化规律进行填写*/
s=s+t; /*求出累加的t值后,累加到变量s中*/
}
return s;
}

阅读理解与欣赏
多项选择题