例4.一个球从100米高度自由落下, 每次落地后反弹到原高度的一半再落下,求它在第10次落地时共经过了多少米?第10次反弹高度是多少?
问题分析:这是一个物理问题,涉及到自由落体和反弹。我们可以通过模拟的方式来解决这个问题。首先,我们需要计算每次落地时的累计距离,然后计算第10次落地时的距离和反弹高度。
设H为经过的路程,h为反弹高度,则有:
第一次反弹时经过的路程:H=100;
第二次反弹时经过的路程:H=100+h₁*2;
------
第十次反弹时经过的路程:H=100+h₁*2+h₂*2------+h₉*2;
程序:
#include <stdio.h>
int main()
{
float H = 100;// 初始高度
float h=100; //第一次反弹前的高度
int count = 1; // 落地次数
while (count < 10)
{
h=h/2;// 计算反弹后的高度
H=H+2*h;
count++;
}
printf("第10次落地时共经过:%f米\n", H);
printf("第十次反弹的高度是:%f米\n",h/2.0);
return 0;
}
输出:第10次落地时共经过:299.609375米,第十次反弹的高度是:0.097656米
注意:循环中得到的只是第九次反弹的高度,所以最后输出时要h/2;
例5.将十进制数 M 转换为八进制数。(无数组的算法)
分析:
首先定义一个整型变量octal_num,用于存储转换后的八进制数。
然后使用for循环进行转换:
a=M%8; //使用模运算符(%)计算M的个位数(即a),并存储在变量a中。
b=M/8; //计算M除以8的商(即b),并存储在变量b中。
octal_num=octal_num+a*i; //将a乘以i(即10的当前位数),然后加到octal_num上。
i=i*10; //将i乘以10,以便计算下一位的值。
M=b; //将b更新为M。
程序:
#include <stdio.h>
int main()
{
int a,b,M;
int i=1;
printf("请输入一个十进制数:");
scanf("%d", &M);
int octal_num = 0;
for(b=0;M>0;)
{
a=M%8;
b=M/8;
octal_num=octal_num+a*i;
i=i*10;
M=b;
}
printf("转换后的八进制数:%d\n", octal_num);
return 0;
}
输入:20 输出:16 ; 输入:40 输出:32
如果你需要将一个八进制数转换为十进制数,只需对原代码进行少量修改。
主要修改修改循环内的操作 :
a = M % 10;
b= M / 10;
i=i*8;
程序:
#include <stdio.h>
int main()
{
int a,b,M;
int i=1;
printf("请输入一个八进制数:");
scanf("%d", &M);
int decimal_num = 0;
for (b = 0; M > 0;)
{
a = M % 10;
b= M / 10;
decimal_num = decimal_num + a * i;
i=i*8;
M=b;
}
printf("转换后的十进制数:%d\n", decimal_num);
return 0;
}
输入:16 输出:20 ; 输入:32 输出:40
例6.有 N 个数在数组 A[N]中, 按从小到大的顺序存放,现有 一个值 KEY,将 KEY 插入 数组A[N] 中,保持升序不变
分析:
这个程序首先定义了一个名为 `insert` 的函数,该函数接受一个整数数组arr、数组长度n和一个要插入的数key。
关于insert函数:
- 在函数中,使用两个循环来遍历数组。第一个循环用于查找第一个大于key的元素,第二个循环用于将该元素及其后面的元素向右移动一个位置,以便为key腾出空间。
- 如果找到了第一个大于key的元素,则将key插入到该元素的位置。否则,将key插入到数组的末尾。
- 最后,使用循环遍历数组并得到结果。
然后,在 `main` 函数中,我们创建了一个示例数组,并调用 `insert` 函数将这个key数插入到数组中。最后,我们打印出修改后的数组,可以看到 KEY 已经被插入并保持升序不变。
程序:
#include <stdio.h>
void insert(int arr[], int n, int key)
{
int i, j;
for (i = 0; i < n; i++)
{
if (arr[i] > key)
{
for (j = n - 1; j >= i; j--)
{
arr[j + 1] = arr[j];
}
arr[i] = key;
break;
}
}
if (i == n)
{
arr[n] = key;
}
}
int main()
{
int arr[10] = {1, 3, 5, 7, 9};
int n = 5;
int key ;
scanf("%d",&key);
insert(arr, n, key);
for (int i = 0; i < n + 1; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输入输出: