试题77-80
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第77套
请补充main函数,该函数的功能是:输入两个正整数m和n,求这两个数的最大公约和最小公倍数。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
main()
{
int a, b, n, m, t;
clrscr();
printf("\nInput two numbers:\n");
scanf ("%d,%d",&n,&m);
if(n { a=m; b=n; } else { a=n; b=m; } while(【1】) { t=【2】 a=b; b=t; } printf("greatest common divisor: %d\n",a); printf("least common multiple: %d\n",【3】); } 【1】b!=0 【2】a%b; 【3】n*m/a 【解析】填空1:本题考查求最大公约数和最小公倍数的方法。变量a保存两数中较大着,变量b保存较小者,采用循环的方法求解最大公约数,循环结束条件是b等于0。填空2:求解最大公约数的思路是,将a 对b求余,如果余数为0,则b即为两数的最大公约数,如果余数不为0,则将b赋给a,余数赋给b,继续将a 对b求余,如此循环,直到余数为0。 填空3:最小公倍数等于两数的乘积除以最大公倍数。 2. 改错题 下列给定程序中函数fun() 的功能是:计算n!。例如,给n输入5,则输出120.000000。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include double fun (int n) { double result=1.0; /**********************found***********************/ if n==0 return 1.0; while(n>1&&n<170) /**********************found***********************/ result *=n-- return result; } main() { int n; printf ("Input N: "); scanf("%d",&n); printf ("\n\n%d!=%lf\n\n",n,fun(n)); } (1)错误:if n= =0 正确:if (n= =0) (2)错误:result*=n- - 正确:result*=n- - ; 【解析】在做这道题之前,我们首先应该明白一个数学上的概念,一般判卷人员先要执行程序,如果结果正确,得满分,否则错一个扣分,再错再扣,本题考查5!即5!=5×4×3×2×1=120,要求输出double 型结果。 3. 编程题 请编写函数fun(),该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中。要求函数把0至9岁年龄段的人数在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,依次类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include # define N 50 # define M 11 void fun(int *a, int *b) { } double rnd() { static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return((double)r/m); } main() { int age[N], i,d[M]; for(i=0; i age[i]=(int)(115*rnd()); /*产生一个随机的年龄数组*/ printf("The original data :\n"); for(i=0; i printf((i+1)%10= =0? "%4d\n":"%4d",age[i]); /*每行输出10个数*/ printf("\n\n"); fun(age,d); for(i=0; i<10; i++) printf("%4d---%4d :%4d\n", i*10, i*10+9,d[i]); printf("Over 100 : %4d\n",d[10]); } 【解析】本题又是一个分段函数的问题,还是用两个循环来完成。第1个循环的作用是使b的所有元素值都为0。这个循环不能省略,因为若未对b元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]大于等于100时,按题意要将其统计到b[10]中,else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0至9时,a[i]/10的值为0,且0至9岁的人数正好要存入b[0]中。若a[i]为10至19岁时a[i]/10的值为1,且10至19岁的人数正好要存入b[1]中,依次类推。 void fun(int *a, int *b) { int i,j; for(j=0;j b[j]=0; /*数组b初始化为0*/ for(i=0;i if(a[i]>=100) b[10]++; /*如果年龄大于等于100,b[10]自增1*/ else b[a[i]/10]++; /*如果年龄小于100,则将其分别统计到b[a[i]/10]中 */ }