6、while循环 - 习题解析

解析部分:

分支练习

1244. 请问一个正整数能够整除几次2

问题描述

请问一个正整数 𝑛n 能够整除几次 2?
比如: 4 可以整除 2 次 2 ,100 可以整除 50次 2 , 9 可以整除 0 次 2 。

解题思路
  1. 读入数据: 从标准输入读取一个正整数 𝑛n
  2. 计算整除次数:
    • 初始化计数器 count 为 0。
    • 当 𝑛n 为偶数时,重复以下步骤:
      • 计数器 count 加 1。
      • 𝑛n 除以 2,更新 𝑛n 的值。
  3. 输出结果: 输出计数器 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 米?

解题思路
  1. 初始化高度: 将初始高度 height 设为 100。
  2. 计算落地次数:
    • 初始化计数器 count 为 0。
    • 当高度 height 大于等于 0.5 时,重复以下步骤:
      • 计数器 count 加 1。
      • 高度 height 除以 2,更新高度的值。
  3. 输出结果: 输出计数器 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 。
两小时后里程表上出现了一个新的对称数。
问该车的速度是多少?新的对称数是多少?
输入
无。
输出
输出两行,第一行是车速,第二行是新的里程数(两个都是整数)。

解题思路
  1. 确定初始里程: 根据题目描述,初始里程为 95859。
  2. 寻找下一个对称数:
    • 从初始里程开始,依次递增里程数。
    • 对于每个里程数,判断它是否为对称数:
      • 取出里程数的万位、千位、十位、个位。
      • 判断万位与个位是否相等,千位与十位是否相等。
    • 当找到下一个对称数时,停止寻找。
  3. 计算车速:
    • 下一个对称数与初始里程的差值即为两小时内行驶的里程。
    • 将里程差除以 2,得到车速(单位为千米/小时)。
  4. 输出结果: 输出两行,第一行为车速,第二行为新的对称数里程。
代码实现
#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,判断是否满足题目要求的条件。

  1. 初始化变量num为1,表示当前检查的数。
  2. 使用while循环,条件为true,即无限循环。
  3. 在循环内,判断num是否满足以下条件:
    • num模5的余数为1。
    • num模6的余数为5。
    • num模7的余数为4。
    • num模11的余数为10。
  4. 如果num满足所有条件,跳出循环。
  5. 如果num不满足条件,将num加1,继续下一轮循环。
  6. 输出满足条件的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 倍。求满足条件的最小的这个自然数。

解题思路
  1. 设自然数为 num,商为 a
  2. 根据题意,num 需要同时满足以下条件:
    • num = (((a * 8 + 7) * 8 + 1) * 8 + 1
    • num = ((2 * a * 17 + 15) * 17 + 4
  3. 由于 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;
}
代码解析
  1. 定义一个整数变量 a,初始值为 0,表示当前正在检查的商。
  2. 使用 while(true) 无限循环来遍历商。
  3. 在循环内部,分别计算两个整数 num1num2:
    • num1 表示第一个条件对应的自然数,即 (((a * 8 + 7) * 8 + 1) * 8 + 1)
    • num2 表示第二个条件对应的自然数,即 ((2 * a * 17 + 15) * 17 + 4)
  4. 使用 if 语句判断 num1 是否等于 num2
    • 如果相等,则找到了满足条件的自然数,输出 num1,并使用 break 跳出循环。
    • 如果不相等,则将 a 加 1,继续检查下一个商。
  5. 循环结束后,输出满足条件的最小自然数。

这段代码将从0开始遍历商,计算出对应的自然数,直到找到满足题目条件的最小自然数为止。最终输出结果即为所求的自然数。

1265. 爱因斯坦的数学题

问题描述

爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨 2 阶,则最最后剩一阶,若每步跨 3 阶,则最后剩 2 阶,若每步跨 5 阶,则最后剩 4 阶,若每步跨 6 阶则最后剩 5 阶。
只有每次跨 7 阶,最后才正好一阶不剩。
请问这条阶梯最少共有多少阶?

解题思路
  1. 设阶梯的总阶数为 num
  2. 根据题意,num 需要同时满足以下条件:
    • num % 2 == 1
    • num % 3 == 2
    • num % 5 == 4
    • num % 6 == 5
    • num % 7 == 0
  3. 从 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;
}
代码解析
  1. 定义一个整数变量 num,初始值为 1,表示当前正在检查的阶梯数。
  2. 使用 while(true) 无限循环来遍历正整数。
  3. 在循环内部,使用 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 阶,最后正好不剩。
  4. 如果 num 满足所有条件,使用 break 跳出循环。
  5. 如果 num 不满足条件,将 num 加 1,继续检查下一个数。
  6. 循环结束后,输出满足条件的最少阶梯数 num

这段代码从1开始遍历正整数,直到找到满足题目条件的最少阶梯数为止。最终输出结果即为所求的阶梯数。

1241. 角谷猜想

问题描述

日本一位中学生发现一个奇妙的定理,请角谷教授证明,而教授无能为力,于是产生了角谷猜想。
猜想的内容:任给一个自然数,若为偶数则除以 2,若为奇数则乘 3 加 1,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1。
请编写代码验证该猜想:求经过多少次运算可得到自然数 1。

解题思路
  1. 读入一个正整数 n
  2. 初始化计数器 count 为 0,表示运算次数。
  3. n 不等于 1 时,重复以下步骤:
    • 如果 n 是偶数,将 n 除以 2。
    • 如果 n 是奇数,将 n 乘以 3 再加 1。
    • 将计数器 count 加 1。
  4. 输出计数器 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;
}
代码解析
  1. 使用 cin 读入一个正整数 n
  2. 初始化计数器 count 为 0,表示运算次数。
  3. 使用 while 循环,当 n 不等于 1 时重复以下步骤:
    • 使用 if 语句判断 n 的奇偶性:
      • 如果 n % 2 == 0,说明 n 是偶数,将 n 除以 2。
      • 如果 n % 2 != 0,说明 n 是奇数,将 n 乘以 3 再加 1。
    • 将计数器 count 加 1,记录运算次数。
  4. 循环结束后,n 的值必为 1,输出计数器 count 的值,表示得到 1 所用的运算次数。

这段代码实现了角谷猜想的验证过程。根据猜想,对于任意给定的正整数 n,通过反复应用"偶数除以2,奇数乘以3加1"的运算规则,最终都会得到 1。代码中的 while 循环模拟了这个过程,并用计数器 count 记录了运算次数。当循环结束时,count 的值就是得到 1 所需的运算次数。

1460. 小明学游泳

问题描述

小明开心的在游泳,可是他很快难过的发现,自己的力气不够,游泳好累哦。
已知小明每换一次气能游 2 米,可是随着越来越累,力气越来越小,他接下来的每换一次气都只能游出上一步距离的 98%。
现在小明想知道,如果要游到距离 x x x 米的地方,他需要总共换多少次气呢。
请你编程解决这个问题。

解题思路
  1. 初始化变量 distance 为 0,表示当前游过的距离。
  2. 初始化变量 step 为 2,表示每换一次气能游的距离。
  3. 初始化计数器 count 为 0,表示换气次数。
  4. distance 小于目标距离 x 时,重复以下步骤:
    • distance 增加 step
    • step 乘以 0.98,表示下一次换气游的距离是当前距离的 98%。
    • 将计数器 count 加 1。
  5. 输出计数器 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;
}
代码解析
  1. 使用 cin 读入一个浮点数 x,表示目标距离。
  2. 初始化变量 distance 为 0,表示当前游过的距离。
  3. 初始化变量 step 为 2,表示每换一次气能游的距离。
  4. 初始化计数器 count 为 0,表示换气次数。
  5. 使用 while 循环,当 distance 小于目标距离 x 时重复以下步骤:
    • distance 增加 step,表示游过的距离增加。
    • step 乘以 0.98,表示下一次换气游的距离是当前距离的 98%。
    • 将计数器 count 加 1,记录换气次数。
  6. 循环结束后,输出计数器 count 的值,表示总共需要换气的次数。

这段代码模拟了小明游泳的过程。初始时,小明每换一次气能游 2 米,但是随着体力的消耗,每次换气游的距离都会减少为上一次的 98%。代码中的 while 循环不断累加游过的距离 distance,并更新下一次换气游的距离 step,同时用计数器 count 记录换气次数。当 distance 大于等于目标距离 x 时,循环结束,count 的值就是小明总共需要换气的次数。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天秀信奥编程培训

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值