一-1
s=720
一-2
The result is:4
一-3
1、y>z
2、j%x1==0&&j%x2==0&&j%x3==0
一-4
n=1
m
五五五五五一快乐
文章目录
一.填空题
1.给出下面程序的运行结果
参考答案
s=720
析
初步分析,函数
int func(int i)
的功能是:求阶乘。
那显然 3 的阶乘是 6 , 6 的阶乘是 720 。
源代码
#include <stdio.h>
int func(int i)
{
int k, s = 1;
for (k = 1; k <= i; k++)
s *= k;
return(s);
}
void main()
{
int s;
s = func(func(3));
printf("s=%d\n",s);
}
2.请写出下面程序的运行结果
参考答案
The result is:4
析
函数的嵌套调用
自己套一下就出来了。
源代码
#include <stdio.h>
int myfun2(int a, int b)
{
int c;
c = a * b % 3;
return c;
}
int myfun1(int a, int b)
{
int c;
a += a; b += b;
c = myfun2(a, b);
return c * c;
}
void main()
{
int x = 4, y = 11;
printf("The result is:%d\n", myfun1(x, y));
}
3.补全代码
以下程序的功能是求三个数的最小公倍数,补足所缺语句,完成下面①②两个填空。
(填空时,若没必须,中间不要插入空格和圆括号)
参考答案
y>z
j%x1==0&&j%x2==0&&j%x3==0
析
第一空
第一个判断语句是
if(x>y && x>z) return (x);
如果x大于y、x大于z同时为真,就返回一个x的值
第二个if判断,判断之后返回y,
最后一个else:不是返回x也不是返回y之后才返回z,
合理外推这个函数是求最大值。
既然第一句已经判断了,x不大于y,x也不大于z,就是再说最大值在y和z之间,所以if的判断条件就是:
y>z
反正x不是最大的,判断y跟z的关系就好了
第二空
scanf("%d,%d,%d",&x1,&x2,&x3);
这句输入了三个数
x0=fun(x1,x2,x3);
紧接着求出了它们的最大值,并且赋值给了x0
然后就是死循环
while(1)
{
j=x0*i;
if(㈡) break;
i=i+1;
}
从循环结束的语句
printf("Result is %d\n",j);
可以看出:
变量 j 就是我们要求的最小公倍数。
第二空就是在判断:当 j 满足了什么条件,它就是要求的最小公倍数。
j 从最大值的一倍,到两倍、三倍、四倍直至无穷。呐,显然是不可能无穷的。
当 j 可以**同时整除**x1、x2、x3之后循环就该结束了(因为这个时候就是最小公倍数了)。
所以可以填:
j%x1==0&&j%x2==0&&j%x3==0
关于运算符优先级
算术运算符(这里指%)的优先级 > 比较运算符(这里指==) > 逻辑运算符(包括&&、||,这里指&&)
所以可以不加括号。
源代码
#include <stdio.h>
int fun(int x,int y,int z)
{
if(x>y && x>z) return (x);
else if(y>z) return (y);
else return (z);
}
void main()
{
int x1,x2,x3,i=1,j,x0;
printf("input 3 intteger:");
scanf("%d,%d,%d",&x1,&x2,&x3);
x0=fun(x1,x2,x3);
while(1)
{
j=x0*i;
if(j%x1==0&&j%x2==0&&j%x3==0) break;
i=i+1;
}
printf("Result is %d\n",j);
}
4、还是补全代码
下面函数的功能是根据以下公式返回满足精度e要求的值。根据算法要求,补足所缺语句,完成下面①②两个填空。
参考答案
n=1
m
析
在for 循环里
m 是每次加上一个变量 t
t 是在原来的基础上乘以一个数
初步判断 m 就是等式左边的 π/2
t 就是那些相加项
这个没问题了,那第二空就可以确定是填:
m
第一空可以通过判断 t 的值来推断:
t 的初值是1.0,这也确实是第一项
在执行这句的时候
t=t*n/(2*n+1);
这应该是求第二项的,第二项是1/3,套进去只有
n=1
可以满足。
源代码
double fun(double e)
{
double m=0.0,t=1.0;
int n;
for(n=1;t>e;n++)
{
m+=t;
t=t*n/(2*n+1);
}
return (2.0*m);
}
二.简答题
请编写一个函数isprime可以判断参数x是否是素数,如果是则返回1,否则返回0。
哥德巴赫猜想:大于等于6的偶数可以用两个素数之和表示。
使用isprime函数找出所有符合猜想的素数对。例如输入10,结果显示为:
3 7
5 5
参考代码
/*
时间:2021-4-30
作者:童话
环境:Win 10 、 VC++ 6
*/
#include <stdio.h>
int isprime(int n)
{
int i;
if(n<=1)
return 0;
else
{
for(i=2;i<n;i++)
{
if(n%i==0)
return 0;
}
if(i>=n)
return 1;
}
}
void main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n/2;i++)
if(isprime(i)&&isprime(n-i))
printf("%d %d\n",i,n-i);
}
三.程序题
1.递归求Fibonacci
Fibonacci数的计算可以写成递归式:
请根据该递归式编写递归函数f,利用该函数编写程序求第n项Fibonacci数。(整数n由键盘输入,结果直接显示不要回国,不要任何提示文字)
参考代码
/*
时间:2021-4-30
作者:童话
环境:Win 10 、 VC++ 6
*/
#include <stdio.h>
int f(int n)
{
if(n<0)
return 0;
if(n==1||n==2)
return 1;
else if(n>2)
return (f(n-1)+f(n-2));
}
void main()
{
int n;
scanf("%d",&n);
printf("%d",f(n));
}
2.递归求最大公约数
最大公约数可以描述成一个递归定义的形式:
请根据这个递归定义编写一个函数gcd。利用该函数,求键盘输入的两个整数a,b的最大公约数。(结果直接显示,不要回车,不要提示文字)例如,输入20 50,结果显示10
参考代码
#include <stdio.h>
int gcd(int m,int n)
{
if(m%n==0)
return n;
else
return (gcd(n,m%n));
}
void main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d",gcd(a,b));
}