梦龙_C语言作业8

一-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));
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

童话与云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值