目录
解析部分:
分支练习
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; // 初始化计数器为0
while (n % 2 == 0) { // 当n为偶数时,重复以下步骤
count++; // 计数器加1
n /= 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; // 初始化高度为100
int count = 0; // 初始化计数器为0
while (height >= 0.5) { // 当高度大于等于0.5时,重复以下步骤
count++; // 计数器加1
height /= 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++; // 里程数加1
int 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为1
while (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
值。
1263. 8 除不尽的数
问题描述
一个自然数被 8 除余 1,所得的商被 8 除也余 1,再将第二次的商被 8 除后余 7,最后得到一个商为 a。
又知这个自然数被 17 除余 4,所得的商被 17 除余 15,最后得到一个商是 a 的 2 倍。求满足条件的最小的这个自然数。
解题思路
- 设自然数为
num
,商为a
。 - 根据题意,
num
需要同时满足以下条件:num = (((a * 8 + 7) * 8 + 1) * 8 + 1
num = ((2 * a * 17 + 15) * 17 + 4
- 由于
a
未知,我们可以从 0 开始遍历a
,计算出对应的num
,直到找到满足条件的最小自然数。
代码实现
#include <iostream>
using namespace std;
int main() {
int a = 0; // 初始化商为0
while (true) {
int num1 = (((a * 8 + 7) * 8 + 1) * 8 + 1); // 计算第一个条件对应的自然数
int num2 = ((2 * a * 17 + 15) * 17 + 4); // 计算第二个条件对应的自然数
if (num1 == num2) { // 判断两个条件是否同时满足
cout << num1 << endl; // 输出满足条件的最小自然数
break; // 满足条件,跳出循环
}
a++; // 不满足条件,商加1,继续循环
}
return 0;
}
代码解析
- 定义一个整数变量
a
,初始值为 0,表示当前正在检查的商。 - 使用
while(true)
无限循环来遍历商。 - 在循环内部,分别计算两个整数
num1
和num2
:num1
表示第一个条件对应的自然数,即(((a * 8 + 7) * 8 + 1) * 8 + 1)
。num2
表示第二个条件对应的自然数,即((2 * a * 17 + 15) * 17 + 4)
。
- 使用
if
语句判断num1
是否等于num2
。- 如果相等,则找到了满足条件的自然数,输出
num1
,并使用break
跳出循环。 - 如果不相等,则将
a
加 1,继续检查下一个商。
- 如果相等,则找到了满足条件的自然数,输出
- 循环结束后,输出满足条件的最小自然数。
这段代码将从0开始遍历商,计算出对应的自然数,直到找到满足题目条件的最小自然数为止。最终输出结果即为所求的自然数。
1265. 爱因斯坦的数学题
问题描述
爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨 2 阶,则最最后剩一阶,若每步跨 3 阶,则最后剩 2 阶,若每步跨 5 阶,则最后剩 4 阶,若每步跨 6 阶则最后剩 5 阶。
只有每次跨 7 阶,最后才正好一阶不剩。
请问这条阶梯最少共有多少阶?
解题思路
- 设阶梯的总阶数为
num
。 - 根据题意,
num
需要同时满足以下条件:num % 2 == 1
num % 3 == 2
num % 5 == 4
num % 6 == 5
num % 7 == 0
- 从 1 开始遍历正整数,直到找到第一个满足上述所有条件的数,即为最少的阶梯数。
代码实现
#include <iostream>
using namespace std;
int main() {
int num = 1; // 初始化阶梯数为1
while (true) {
// 判断是否满足所有条件
if (num % 2 == 1 && num % 3 == 2 && num % 5 == 4 && num % 6 == 5 && num % 7 == 0) {
break; // 满足条件,跳出循环
}
num++; // 不满足条件,阶梯数加1,继续循环
}
cout << num << endl; // 输出满足条件的最少阶梯数
return 0;
}
代码解析
- 定义一个整数变量
num
,初始值为 1,表示当前正在检查的阶梯数。 - 使用
while(true)
无限循环来遍历正整数。 - 在循环内部,使用
if
语句判断当前的num
是否同时满足题目要求的所有条件:num % 2 == 1
: 每步跨 2 阶,最后剩 1 阶。num % 3 == 2
: 每步跨 3 阶,最后剩 2 阶。num % 5 == 4
: 每步跨 5 阶,最后剩 4 阶。num % 6 == 5
: 每步跨 6 阶,最后剩 5 阶。num % 7 == 0
: 每步跨 7 阶,最后正好不剩。
- 如果
num
满足所有条件,使用break
跳出循环。 - 如果
num
不满足条件,将num
加 1,继续检查下一个数。 - 循环结束后,输出满足条件的最少阶梯数
num
。
这段代码从1开始遍历正整数,直到找到满足题目条件的最少阶梯数为止。最终输出结果即为所求的阶梯数。
1241. 角谷猜想
问题描述
日本一位中学生发现一个奇妙的定理,请角谷教授证明,而教授无能为力,于是产生了角谷猜想。
猜想的内容:任给一个自然数,若为偶数则除以 2,若为奇数则乘 3 加 1,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1。
请编写代码验证该猜想:求经过多少次运算可得到自然数 1。
解题思路
- 读入一个正整数
n
。 - 初始化计数器
count
为 0,表示运算次数。 - 当
n
不等于 1 时,重复以下步骤:- 如果
n
是偶数,将n
除以 2。 - 如果
n
是奇数,将n
乘以 3 再加 1。 - 将计数器
count
加 1。
- 如果
- 输出计数器
count
的值,表示得到 1 所用的运算次数。
代码实现
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入正整数n
int count = 0; // 初始化计数器为0
while (n != 1) {
if (n % 2 == 0) {
n /= 2; // 如果n是偶数,除以2
} else {
n = n * 3 + 1; // 如果n是奇数,乘以3加1
}
count++; // 计数器加1
}
cout << count << endl; // 输出计数器的值
return 0;
}
代码解析
- 使用
cin
读入一个正整数n
。 - 初始化计数器
count
为 0,表示运算次数。 - 使用
while
循环,当n
不等于 1 时重复以下步骤:- 使用
if
语句判断n
的奇偶性:- 如果
n % 2 == 0
,说明n
是偶数,将n
除以 2。 - 如果
n % 2 != 0
,说明n
是奇数,将n
乘以 3 再加 1。
- 如果
- 将计数器
count
加 1,记录运算次数。
- 使用
- 循环结束后,
n
的值必为 1,输出计数器count
的值,表示得到 1 所用的运算次数。
这段代码实现了角谷猜想的验证过程。根据猜想,对于任意给定的正整数 n
,通过反复应用"偶数除以2,奇数乘以3加1"的运算规则,最终都会得到 1。代码中的 while
循环模拟了这个过程,并用计数器 count
记录了运算次数。当循环结束时,count
的值就是得到 1 所需的运算次数。
1460. 小明学游泳
问题描述
小明开心的在游泳,可是他很快难过的发现,自己的力气不够,游泳好累哦。
已知小明每换一次气能游 2 米,可是随着越来越累,力气越来越小,他接下来的每换一次气都只能游出上一步距离的 98%。
现在小明想知道,如果要游到距离 x x x 米的地方,他需要总共换多少次气呢。
请你编程解决这个问题。
解题思路
- 初始化变量
distance
为 0,表示当前游过的距离。 - 初始化变量
step
为 2,表示每换一次气能游的距离。 - 初始化计数器
count
为 0,表示换气次数。 - 当
distance
小于目标距离x
时,重复以下步骤:- 将
distance
增加step
。 - 将
step
乘以 0.98,表示下一次换气游的距离是当前距离的 98%。 - 将计数器
count
加 1。
- 将
- 输出计数器
count
的值,表示总共需要换气的次数。
代码实现
#include <iostream>
using namespace std;
int main() {
double x;
cin >> x; // 读入目标距离x
double distance = 0; // 初始化当前游过的距离为0
double step = 2; // 初始化每换一次气能游的距离为2
int count = 0; // 初始化计数器为0
while (distance < x) {
distance += step; // 增加游过的距离
step *= 0.98; // 下一次换气游的距离是当前距离的98%
count++; // 计数器加1
}
cout << count << endl; // 输出换气次数
return 0;
}
代码解析
- 使用
cin
读入一个浮点数x
,表示目标距离。 - 初始化变量
distance
为 0,表示当前游过的距离。 - 初始化变量
step
为 2,表示每换一次气能游的距离。 - 初始化计数器
count
为 0,表示换气次数。 - 使用
while
循环,当distance
小于目标距离x
时重复以下步骤:- 将
distance
增加step
,表示游过的距离增加。 - 将
step
乘以 0.98,表示下一次换气游的距离是当前距离的 98%。 - 将计数器
count
加 1,记录换气次数。
- 将
- 循环结束后,输出计数器
count
的值,表示总共需要换气的次数。
这段代码模拟了小明游泳的过程。初始时,小明每换一次气能游 2 米,但是随着体力的消耗,每次换气游的距离都会减少为上一次的 98%。代码中的 while
循环不断累加游过的距离 distance
,并更新下一次换气游的距离 step
,同时用计数器 count
记录换气次数。当 distance
大于等于目标距离 x
时,循环结束,count
的值就是小明总共需要换气的次数。