Skip to content

喵~ 各位程序员哥哥姐姐们好呀,我是你们的专属解题猫娘!今天我们要看的是一道来自 Codeforces 的可爱题目,A. Wrong Subtraction。这道题就像是和小猫玩耍一样简单有趣,我们一起来看看吧!

题目大意

这道题讲了一个叫 Tanya 的小女孩学习减法的趣事,喵~。

Tanya 的减法规则有点特别:

  1. 如果一个数的最后一位不是 0,她就会把这个数减 1。
  2. 如果一个数的最后一位是 0,她就会把这个数除以 10(也就是去掉最后一位的 0)。

题目会给我们两个整数 nk。我们需要做的就是,对数字 n 重复 k 次 Tanya 的奇特减法操作,然后输出最后得到的结果。

举个栗子:如果 n = 512, k = 4,Tanya 的计算过程是这样的: 512511 (最后一位是 2,非 0,减 1) 511510 (最后一位是 1,非 0,减 1) 51051 (最后一位是 0,除以 10) 5150 (最后一位是 1,非 0,减 1)

经过 4 次操作,最后的结果就是 50 啦!

解题思路

这道题最关键的地方在于 k 的值非常小(1 ≤ k ≤ 50)。这意味着我们只需要老老实实地按照 Tanya 的规则,一步一步地模拟她的操作 k 次,就能得到答案了,完全不需要什么复杂的算法,是不是很简单呀?

具体的思路就是:

  1. 我们用一个循环,让它重复 k 次。
  2. 在每次循环里,我们检查一下当前数字 n 的最后一位是什么。
  3. 要得到一个数的最后一位,我们可以用取模运算 %n % 10 得到的就是 n 的个位数。
  4. 如果 n % 10 == 0,说明最后一位是 0,我们就执行 n = n / 10
  5. 如果 n % 10 != 0,说明最后一位不是 0,我们就执行 n = n - 1
  6. 循环 k 次之后,n 的值就是我们想要的答案啦,直接输出就好!

AC 代码详解

下面是这道题的 C++ 参考代码,我已经加上了猫娘的专属注释,希望能帮助你更好地理解哦,喵~

cpp
#include <iostream>

// 这是解决 Codeforces "Wrong Subtraction" 问题的程序哦。
// 题目描述了一种特殊的数字递减算法,我们需要把它应用 k 次。

void solve() {
    long long n; // n 最大可以到 10^9,所以用 long long 比较保险
    int k;       // k 最大只有 50,用 int 就足够啦
    std::cin >> n >> k;

    // 我们需要重复 k 次减法操作,所以用一个 for 循环是最好的选择!
    for (int i = 0; i < k; ++i) {
        // 检查 n 的最后一位数字。
        // 用 n % 10 就能轻松得到最后一位啦,这是个常用的小技巧!
        if (n % 10 == 0) {
            // 如果最后一位是 0,就把它“吃掉”(除以 10)
            n /= 10;
        } else {
            // 如果最后一位不是 0,就乖乖地减 1
            n--;
        }
    }

    // k 次操作之后,把最后的结果打印出来~
    std::cout << n << '\n';
}

int main() {
    // 这两行是为了让输入输出变得更快一点,在比赛里很有用哦!
    // std::ios_base::sync_with_stdio(false) 解除 C++ 流和 C 标准流的同步
    // std::cin.tie(nullptr) 防止 cin 在每次输入时刷新 cout
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    solve();

    return 0;
}

知识点小课堂

这道题虽然简单,但是里面用到的几个知识点可是编程入门的基石呢!让猫娘来给你梳理一下吧~

  1. 循环语句 (for loop)

    • for 循环非常适合用来执行固定次数的操作。在这道题里,我们需要执行 k 次操作,所以 for (int i = 0; i < k; ++i) 就完美地满足了我们的需求。
  2. 条件语句 (if-else statement)

    • if-else 语句用于根据不同的条件执行不同的代码块。在这里,我们需要根据“最后一位是否为0”这个条件来决定是做除法还是做减法,if-else 正是为此而生的!
  3. 取模运算符 (%)

    • 这是一个非常神奇的运算符!a % b 的结果是 a 除以 b 的余数。
    • b 等于 10 时,n % 10 就能巧妙地取出整数 n 的个位数。比如 512 % 10 的结果是 2510 % 10 的结果是 0。这是处理数字各位的必备技巧!
  4. 整除运算符 (/)

    • 在 C++ 中,当两个整数相除时,结果会自动取整(舍弃小数部分)。
    • 所以 n / 10 就能实现“去掉 n 的最后一位”这个效果。比如 512 / 10 的结果是 51

好啦,这次的题解就到这里结束啦!是不是感觉很简单呢?只要掌握了这些基础知识,很多问题都能迎刃而解的。下次再见咯,喵~!

Released under the MIT License.