5.5 弹弹弹
题目概述:
1个球从 100m 高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹,求它在第 10 次落地时,共经过了多少米?第 10 次反弹多高?
题目思路:
-
根据题意划出图解
- ps:具体小球是怎么样下落反弹的请自行想象,本题只是做一个拆解,不代表他就是这样下落的。
-
本题需要注意,一个球一直跳回原高度的一半,肯定会出现小数,所以要用浮点型来进行计算
-
然后我们循环进行每次小球的距离即可
- 计算小球从高处下落到地上的距离
- 然后在计算反弹的距离
- 然后再把下落和反弹的距离加上,就是本次小球经过的米数
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
double high = 100.0;
double meter = 0.0;
int i = 0;
for (i = 1; i <= 10; i++)
{
meter += high; //小球从高处下落到地上的距离
high /= 2; //小球从地上反弹的距离
meter += high; //小球从该次从高处下落+地上到从地上反弹的距离
}
meter -= high; //减去反弹的距离,就是题目第十次到地上的距离
printf("high is : %lf\n", high);
printf("meter is : %lf\n", meter);
return 0;
}
运行结果如下:
- 本题需要注意读题的细节,题目问的是第10次落地时,共经过了多少米,而没有说第十次反弹经过了多少米,所以我们在计算完之后要记得减去第10次反弹的高度
5.6 输出菱形图案
题目概述:
输出一下图案
题目思路:
本题我们可以做一个通用的打印菱形
我们把菱形分成这样
然后分成上半和下半,开始找规律
先看上半
i | 空格数量 | 星号 |
---|---|---|
0 | 3 | 1 |
1 | 2 | 3 |
2 | 1 | 5 |
3 | 0 | 7 |
推出公式 | line - 1 - i | 2 * i + 1 |
- line表示多少行。
得出上半部分代码
for (i = 0; i < line; i++)
{
for (j = 0; j < (line - 1 - i); j++)
{
printf(" ");
}
for (j = 0; j < (2 * i + 1); j++)
{
printf("*");
}
printf("\n");
}
运行结果如下:
再看下半
i | 空格数量 | 星号 |
---|---|---|
0 | 1 | 5 |
1 | 2 | 3 |
2 | 3 | 1 |
推出公式 | i + 1 | 2*(line-1-i)-1 |
得出下半部分代码:
for (i = 0; i < (line - 1); i++)
{
for (j = 0; j < (i + 1); j++)
{
printf(" ");
}
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
运行结果如下:
然后分别打印出上下半即可。
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int line = 0;
int j = 0;
scanf("%d", &line);
for (i = 0; i < line; i++)
{
for (j = 0; j < (line - 1 - i); j++)
{
printf(" ");
}
for (j = 0; j < (2 * i + 1); j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < (line - 1); i++)
{
for (j = 0; j < (i + 1); j++)
{
printf(" ");
}
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
运行结果如下:
- 以上是通用输入菱形,对于本题来说,输入4行,那么就能打印出本题要求的菱形。
- 如果不需要输入直接打印,那么上半有4行,我们把line=4,代入本题条件即可,具体如下。
本题代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int line = 0;
int j = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < (3 - i); j++)
{
printf(" ");
}
for (j = 0; j < (2 * i + 1); j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < (i + 1); j++)
{
printf(" ");
}
for (j = 0; j < 2 * (3 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
- 只需要修改一下循环条件即可完成本题。
5.7 找球手
题目概述:
两个乒乓球队进行比赛,各出3 人。甲队为 A、B、C 3 人,乙队为 X、Y、Z 3 人。已抽签决定比赛名单。有人向队员打听比赛的名单,A 说他不和 X 比,C 说他不和 X、Z 比,请编写程序找出 3 对赛手的名单。
题目思路:
-
由题意得,画图得出以下关系
-
然后我们还得知道,由于这个比赛都是1v1,不可能出现A又要打X又要打Y的情况,所以还得出了一个条件是
A != B && A!=C && B!=C
-
用A、B、C一一列举对手,直到满足判断条件为止即可。
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int A = '0';
int B = '0';
int C = '0';
//整型和字符型是可以相互转换的,所以int和char皆可。这里用int,因为要用来执行判断条件
for (A = 'X'; A <= 'Z'; A++)
{
for (B = 'X'; B <= 'Z'; B++)
{
for (C = 'X'; C <= 'Z'; C++)
{
if (A != B && A != C && B != C && A != 'X' && C != 'X' && C != 'Z')
{
printf("A VS %c\n", A);
printf("B VS %c\n", B);
printf("C VS %c\n", C);
}
}
}
}
return 0;
}
运行结果如下: