C语言习题练习:自由落体反弹问题+猴子吃桃问题+打印菱形图案+计算2/1,3/2,5/3.....的前20项之和+计算1!+2!+...+20!的和

题目一:自由落体反弹问题

一球从x米搞多自由落下,每次落地后反跳会原高度的一般后在落下,求它在第十次落地时,共经过多少米?第十次反弹有多高?

思路

1.首先定义落体高度

float x = 0;
	printf("请输入小球距离地面高度(单位:米): ");
		scanf("%f", &x);

反弹总行程为:s=s+x*2的循环,转换成C语言

float s = x;
		x = x / 2;
		int i;
		for (i =2 ; i <=y ; i++)
		{
			s = s + x *2;
			x = x / 2;
		}

整体程序如下:

#include <stdio.h>
int main()
{
	float x = 0;
	int y;//要计算的弹起的次数
	printf("请输入小球距离地面高度(单位:米): ");
		scanf("%f", &x);
		float h;//小球下降高度初始数值保存
		h = x;
	printf("请输入要计算的小球弹起次数: ");
		scanf("%d", &y);
		float s = x;
		x = x / 2;
		int i;
		for (i =2 ; i <=y ; i++)
		{
			s = s + x *2;
			x = x / 2;
		}
		printf("小球在 %f 米自由落体后,经过 %d 次弹起落地后,共经过 %f 米,第 %d 次反弹高度为 %f 米\n", h, y, s, y, x);
	return 0;
}

结果
在这里插入图片描述

题目二:猴子吃桃问题

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的条子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,只见剩下一个桃子。
求第一天共摘了多少?

思路

方程式如下:
x10=1
x9=(x10+1)*2
x8=(x9+1)*2

x1=(x2+1)*2
用for语言将上面的方程转化

int day;
	int y = 0;
	int x = 1;
	for (day = 9; day >= 1; day--)
	{
		y = (x + 1) * 2;
		x = y;
	}

完整编码如下:

#include <stdio.h>
int main()
{
	int day;
	int y = 0;
	int x = 1;
	for (day = 9; day >= 1; day--)
	{
		y = (x + 1) * 2;
		x = y;
	}
	printf("第一天总共摘了%d个桃子\n", y);
	return 0;
}

结果
在这里插入图片描述

题目三:打印菱形图案

用C语言打印如下图案,不能直接用printf输出

   *
  ***
 *****
*******
 *****
  ***
   *

思路

要先打印空格,然后打印*,此时存在两个变量,采用for循环还缺少一个判断条件,那就是打印几行,那么总共就是三个变量

int i, j, k;

先打印上半部分

for (i = 1; i <= 4; i++) //先打印前4行
	{
		for (j = 1; j <= 4 - i; j++) //每一行先打印需要打印的空格,空格数为(4 - 行号),譬如第1行,需要打4-1个空格,第2行需要打4-2个空格
			printf(" ");
		for (k = 1; k <= 2 * i - 1; k++) //打完空格打‘*',每行需要打印2倍行号-1个,譬如第1行打印2*1 - 1个,第2行打印2*2 - 1=3个
			printf("*");
		printf("\n");
	}

接下来打印后面三行

for (i = 1; i <= 3; i++) //然后打印后面三行,行号从1开始计算
	{
		for (j = 1; j <= i; j++) //每行打印空格数为行号数,譬如第1行打印1个,第2行打印2个
			printf(" ");
		for (k = 1; k <= 7 - 2 * i; k++) //每行打印7-2*i个’*',譬如第1行打印7-2*1=5个,第2行打印7-2*2=3个
			printf("*");
		printf("\n");
	}

完成编码如下:

#include <stdio.h>
int main(void)
{
	int i, j, k;
	for (i = 1; i <= 4; i++) //先打印前4行
	{
		for (j = 1; j <= 4 - i; j++) //每一行先打印需要打印的空格,空格数为(4 - 行号),譬如第1行,需要打4-1个空格,第2行需要打4-2个空格
			printf(" ");
		for (k = 1; k <= 2 * i - 1; k++) //打完空格打‘*',每行需要打印2倍行号-1个,譬如第1行打印2*1 - 1个,第2行打印2*2 - 1=3个
			printf("*");
		printf("\n");
	}
	for (i = 1; i <= 3; i++) //然后打印后面三行,行号从1开始计算
	{
		for (j = 1; j <= i; j++) //每行打印空格数为行号数,譬如第1行打印1个,第2行打印2个
			printf(" ");
		for (k = 1; k <= 7 - 2 * i; k++) //每行打印7-2*i个’*',譬如第1行打印7-2*1=5个,第2行打印7-2*2=3个
			printf("*");
		printf("\n");
	}
	return 0;
}

结果
在这里插入图片描述

题目四:有一组数列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

思路

注意分子与坟墓的变化规律

20个数相加,可以采用for循环

	int i;
	for (i = 1; i <= 20; i++)
	{

	}

首项进行定义

int a = 2;
int b = 1;

计算语句

for (i = 1; i <= 20; i++)
	{
		sum = sum + a / b;
		t = a;
		a = a + b;
		b = t;
	}

完整代码如下

#include <stdio.h>
int main()
{
	int i;
	float sum = 0;
	float a = 2;
	float b = 1;
	float t;//中间变量
	for (i = 1; i <= 20; i++)
	{
		sum = sum + a / b;
		t = a;
		a = a + b;
		b = t;
	}
	printf("sum=%.3f\n", sum);
	return 0;
}

结果
在这里插入图片描述
注意:
a和b不能定义为整型数,整型数除以整型数还是整型

题目五:计算1!+2!+…+20!的和

思路

和上一题一样,采用for循环

int i;
	int sum = 0;
	for (i = 1; i <= 20; i++)
	{
		
	}

关于阶乘我们可以写成一个函数,然后通过函数调用

long double jc(int m)
{
	long double chengji = 1;
	int j;
	for (j = 1; j <= m; j++)
	{
		chengji = chengji * j;
	}
	return chengji;
}

完整编码如下:

#include <stdio.h>
long double jc(int m)
{
	long double chengji = 1;
	int j;
	for (j = 1; j <= m; j++)
	{
		chengji = chengji * j;
	}
	return chengji;
}
int main()
{
	long double jc(int m);
	int i;
	long double sum = 0;
	for (i = 1; i <= 20; i++)
	{
		sum = sum + jc(i);
	}
	printf("sum=%Lf\n", sum);
	return 0;
}

结果
在这里插入图片描述
注意:20!很大,如果采用整型定义会存在越界情况,所以要采用长整型即采用

long double
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hello xiǎo lěi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值