目录
- 解析部分:
- 分支练习
- 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值。