10.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
该题目需要循环10次,在每一循环的时候,需要将下落的高度和回弹的高度加起来。需要注意的点,第10次下落不需要在计算回弹的距离了,所以需要特殊处理下。在计算每次高度的时候,会有小数存在,所以需要选用浮点数
源代码如下:
#include <stdio.h> int main() { //总高度 double total_m = 100.0; //小球经历的米数 double total_sum = 0.0; for (int i = 0; i < 10; i++) { total_sum += total_m; total_m /= 2; total_sum += total_m; } //不需要计算第10次的反弹高度,所以减去 total_sum -= total_m; printf("小球总共经历%lf米, 第10次反弹%lf米\n", total_sum, total_m); return 0; }
11. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
后一天的桃子数量 = 前一天桃子数量 / 2 - 1
前一天的桃子数量 = (后一天桃子数量+1) * 2
我们知道了第10天剩余桃子的数量,则可以依次推算出桃子的前一天桃子的总数。需要注意的点,猴子只是吃了9天,所以,我们只需要遍历9次就可以了
12. 用牛顿迭代法求下面方程在1.5附近的根:2x^3- 4x^2 + 3x - 6= 0
#include <stdio.h> #include <math.h> int main() { double x1, x0, f, f1; x1 = 1.5; do { x0 = x1; f = ((2 * x0 - 4) * x0 + 3) * x0 - 6; f1 = (6 * x0 - 8) * x0 + 3; x1 = x0 - f / f1; } while(fabs(x1 - x0) >= 1e-5); printf("方程在1.5附近的根为:%lf\n", x1); return 0;
13. 用二分法求上一题方程在(-10,10)的根:
将区间划分为两部分,记录区间左右端点,得到中点。每次运算将中点带入方程进行运算,求得结果,
进行分析:
结果 > 0:将中位数赋值给右端点
结果 < 0:将中位数赋值给左端点
以此类推...
fabs函数是一个求绝对值的函数,求出x的绝对值,和数学上的概念相同;
1e-5:10^{-5},即0.00001
14. 输出以下图案:
*
***
*****
*******
*****
***
*
该题目需要关心当前行对应的从最左边到第一颗 * 的空格数量以及星星数量。将该题分为两个部分,前面4行和后面3行来进行拆分。
前4行中:
第一行:行号为0, 空格数为3,星星数量为1;
第二行:行号为1, 空格数为2, 星星数量为3;
第三行:行号为2, 空格数为1, 星星数量为5;
第四行:行号为3, 空格数为0,星星数量为7;
则我们可以推出两组关系,即行号和空格数量关系为:空格数 = 3 - 行号 。行号与星星的关系为星星数 = 2 * 行号 + 1
后三行中:
第一行:行号为0,空格数为1,星星数量为5;
第二行:行号为1, 空格数为2, 星星数量为3;
第三行:行号为2, 空格数为3,星星数量为1;
则我们推出两组关系,即行号与数量的关系:空格数 = 行号 + 1。行号与星星的关系:星星数 = 7- 2 *(行号+1)
15. 两个乒乓球队进行比赛,各出3人。甲队为A,B,C 3人,乙队为X,Y,Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。
从题面上得知,每队为3人,则隐含条件为队内三人是不能比赛的,并且A一定不会和X比,C一定不会X和Z比;则我们不难写出判断条件:
如果A和X比 或者 C和X比 或者 C和Z比 或者 A和B比 或者 A和C比 或者 B和C比,都是不可以的;所以我们只要穷举A比赛对象,B比赛对象,C比赛对象,判断上述条件就可以了;
后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!