目录
- 解析部分:
- 分支练习
- 1244. 请问一个正整数能够整除几次2
- 问题描述
- 解题思路
- 代码实现
- 代码解析
- 1062. 求落地次数
- 问题描述
- 解题思路
- 代码实现
- 代码解析
- 1254. 求车速
- 问题描述
- 解题思路
- 代码实现
- 代码解析
- 1261. 韩信点兵
- 问题描述
- 解题思路
- 代码实现
- 代码解析
解析部分:
分支练习
1244. 请问一个正整数能够整除几次2
问题描述
请问一个正整数 𝑛n 能够整除几次 2?
比如: 4 可以整除 2 次 2 ,100 可以整除 50次 2 , 9 可以整除 0 次 2 。
解题思路
- 读入数据: 从标准输入读取一个正整数 𝑛n。
- 计算整除次数:
- 初始化计数器
count
为 0。 - 当 𝑛n 为偶数时,重复以下步骤:
- 计数器
count
加 1。 - 𝑛n 除以 2,更新 𝑛n 的值。
- 计数器
- 初始化计数器
- 输出结果: 输出计数器
count
的值,表示 𝑛n 能够被 2 整除的次数。
代码实现
#include <iostream>
using namespace std;
int main() {int n; // 定义一个整型变量来存储输入的数cin >> n; // 通过标准输入读取这个数int count = 0; // 初始化计数器为0while (n % 2 == 0) { // 当n为偶数时,重复以下步骤count++; // 计数器加1n /= 2; // n除以2,更新n的值}cout << count << endl; // 输出计数器的值,表示n能够被2整除的次数return 0; // 程序结束
}
代码解析
- 使用
cin
从标准输入读取一个整数n
。 - 初始化计数器
count
为0。 - 使用
while
循环,当n
为偶数时(n % 2 == 0
),重复以下步骤:- 计数器
count
加1。 n
除以2,更新n
的值。
- 计数器
- 使用
cout
输出计数器count
的值,表示n
能够被2整除的次数。
问题描述中的例子也进行了修正:
- 4 可以整除 2 次 2
- 100 可以整除 2 次 2
- 9 可以整除 0 次 2
1062. 求落地次数
问题描述
小球从 100 米高处自由落下,着地后又弹回高度的一半再落下。
经过多少次落地后,小球弹起的高度才会低于 0.5 米?
解题思路
- 初始化高度: 将初始高度
height
设为 100。 - 计算落地次数:
- 初始化计数器
count
为 0。 - 当高度
height
大于等于 0.5 时,重复以下步骤:- 计数器
count
加 1。 - 高度
height
除以 2,更新高度的值。
- 计数器
- 初始化计数器
- 输出结果: 输出计数器
count
的值,表示小球落地的次数。
代码实现
#include <iostream>
using namespace std;
int main() {double height = 100; // 初始化高度为100int count = 0; // 初始化计数器为0while (height >= 0.5) { // 当高度大于等于0.5时,重复以下步骤count++; // 计数器加1height /= 2; // 高度除以2,更新高度的值}cout << count << endl; // 输出计数器的值,表示小球落地的次数return 0; // 程序结束
}
代码解析
- 初始化高度
height
为100。 - 初始化计数器
count
为0。 - 使用
while
循环,当高度height
大于等于0.5时,重复以下步骤:- 计数器
count
加1。 - 高度
height
除以2,更新高度的值。
- 计数器
- 使用
cout
输出计数器count
的值,表示小球落地的次数。
1254. 求车速
问题描述
一辆以固定速度行驶的汽车,司机在上午 10 点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为 95859 。
两小时后里程表上出现了一个新的对称数。
问该车的速度是多少?新的对称数是多少?
输入
无。
输出
输出两行,第一行是车速,第二行是新的里程数(两个都是整数)。
解题思路
- 确定初始里程: 根据题目描述,初始里程为 95859。
- 寻找下一个对称数:
- 从初始里程开始,依次递增里程数。
- 对于每个里程数,判断它是否为对称数:
- 取出里程数的万位、千位、十位、个位。
- 判断万位与个位是否相等,千位与十位是否相等。
- 当找到下一个对称数时,停止寻找。
- 计算车速:
- 下一个对称数与初始里程的差值即为两小时内行驶的里程。
- 将里程差除以 2,得到车速(单位为千米/小时)。
- 输出结果: 输出两行,第一行为车速,第二行为新的对称数里程。
代码实现
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{ int n = 95859; // 初始里程int n2 = 95859; // 保存初始里程的副本while(true) // 无限循环,直到找到下一个对称数{n++; // 里程数加1int g = n%10; // 取个位int s = n/10%10; // 取十位int q = n/1000%10; // 取千位int w = n/10000%10; // 取万位if(w==g && q==s) // 如果万位与个位相等,千位与十位相等,则为对称数{break; // 跳出循环}}cout<<(n-n2)/2<<endl; // 输出车速cout<<n<<endl; // 输出新的对称数里程return 0;
}
代码解析
- 初始化初始里程
n
为95859,并复制一份到n2
。 - 使用无限循环
while(true)
,直到找到下一个对称数为止。 - 里程数
n
加1,继续寻找。 - 取出里程数的个位
g
、十位s
、千位q
、万位w
。 - 判断万位
w
与个位g
是否相等,千位q
与十位s
是否相等,如果都相等,则为对称数,跳出循环。 - 计算车速,为
(n-n2)/2
,即新里程与初始里程的差值除以2。 - 输出车速和新的对称数里程
n
。
1261. 韩信点兵
问题描述
韩信有一队士兵,他想知道有多少人,他就让士兵报数,如果按照 1 到 5 报数,最末一个士兵报的数为 1 。
按照 1到 6 报数,最末一个士兵报的数为 5 。
按照 1 到 7 报数,最末一个士兵报的数为 4 。
最后再按 1 到11 报数,最末一个士兵报的数为 10 。
请问韩信这队士兵最少有多少人?
解题思路
我们可以从1开始依次递增,对每个数分别模5、6、7、11,判断是否满足题目要求的条件。
- 初始化变量
num
为1,表示当前检查的数。 - 使用while循环,条件为
true
,即无限循环。 - 在循环内,判断
num
是否满足以下条件:num
模5的余数为1。num
模6的余数为5。num
模7的余数为4。num
模11的余数为10。
- 如果
num
满足所有条件,跳出循环。 - 如果
num
不满足条件,将num
加1,继续下一轮循环。 - 输出满足条件的
num
值。
代码实现
#include <iostream>
using namespace std;
int main() {int num = 1; // 初始化num为1while (true) { // 无限循环if (num % 5 == 1 && num % 6 == 5 && num % 7 == 4 && num % 11 == 10) {break; // 如果num满足所有条件,跳出循环}num++; // 如果num不满足条件,num加1,继续下一轮循环}cout << num << endl; // 输出满足条件的num值return 0;
}
代码解析
- 初始化变量
num
为1,表示当前检查的数。 - 使用while循环,条件为
true
,即无限循环。 - 在循环内,判断
num
是否满足以下条件:num % 5 == 1
:num
模5的余数为1。num % 6 == 5
:num
模6的余数为5。num % 7 == 4
:num
模7的余数为4。num % 11 == 10
:num
模11的余数为10。
- 如果
num
满足所有条件,使用break
语句跳出循环。 - 如果
num
不满足条件,将num
加1,继续下一轮循环。 - 输出满足条件的
num
值。