题目
题目一:自由落体反弹问题
一球从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