9.2练习题1.汪老师的烟 题解

题目出处:洛谷 P1150

题目描述

汪老师有n根烟,他每吸完一根烟就把烟蒂保存起来,\(k(k>1)\) 个烟蒂可以换一个新的烟,那么 汪老师 最终能吸到多少根烟呢?

输入格式

每组测试数据一行包括两个整数 \(n,k(1<n,k \le 10^8)\)

输出格式

对于每组测试数据,输出一行包括一个整数表示最终烟的根数。

样例输入1

4 3

样例输出1

5

样例输入2

10 3

样例输出2

14

题目分析

这道题目是一道很基础的题目。考我们的知识点就是 循环
我们可以开两个变量 \(n\)\(m\)\(n\) 用于表示当前我拥有的香烟的数量, \(m\) 用于表示当前我拥有的烟蒂的数量(一开始 \(m = 0\))。然后我们再开一个变量 \(ans\) 用于表示 汪老师 目前已经抽的烟的数量。
然后我们开始进行循环,循环成立的条件是 \(n \gt 0\) (即 汪老师 还有烟抽,如果 \(n = 0\) 则 汪老师 没有烟可以抽,那么我们的循环就结束了)。
循环里面,每一次我们需要执行如下操作:

  1. \(ans += n;\) :这一步我首先会将我手头上的所有的烟都抽掉;
  2. \(m += n;\)\(n\) 根烟抽掉后,烟蒂的总数 \(m\) 会增加 \(n\)
  3. \(n = m / k;\) :每 \(k\) 个烟蒂可以兑换一根烟;
  4. \(m \%= k;\) :兑换后剩下的烟蒂的数量更新为 \(m\ MOD\ k\)(这里的“MOD”是模运算的意思,相当于C++里面的“%”,表示一个数被另一个数除的余数)。

如实循环,直到汪老师没有可以抽的烟为止。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, m, k, ans;
int main() {
    cin >> n >> k;
    while (n) {
        ans += n;
        m += n;
        n = m / k;
        m %= k;
    }
    cout << ans << endl;
    return 0;
}

另外需要注明的是,汪老师其实不抽烟,吸烟有害身体健康,大家以后也不要抽烟哈。

posted @ 2019-09-15 20:45  zifeiynoip  阅读(159)  评论(0编辑  收藏  举报