top1编程
← 返回题目
题解

数的分离

1 条题解

  • 0
    @ 2026-8-5 12:14:09

    解题思路

    题目要我们把一个正整数 n 的倒数第 k 个数字找出来。比如 n=1859,k=3,从右边数:个位是9(第1个)、十位是5(第2个)、百位是8(第3个),所以答案是 8。

    怎么"剥离"数字呢?C++ 里有两个法宝:

    • n % 10:取出 n 的最后一位(个位);
    • n / 10:把 n 的最后一位去掉(整除10)。

    于是我们可以这样做:

    1. 先把 n 右边的前 k-1 个数字一个一个去掉(每去掉一个,n 就除以10一次);
    2. 剩下的最后一位,就是原来从右边数第 k 个数字;
    3. 用 n % 10 把它取出来输出。

    打个比方:数字就像一摞饼干,/10 是把最下面那块饼干拿走,%10 是看看最下面那块饼干是什么味道。想看倒数第3块,就先拿走下面2块,再看最下面那一块!

    题目要求把这件事写成 digit() 函数,主程序只需要调用它就行。

    参考代码

    // P4606 数的分离:输出正整数n从右边数第k个数字
    #include <iostream>
    using namespace std;
    
    // digit函数:返回n从右边数第k个数字
    int digit(int n, int k) {
        for (int i = 1; i < k; i++) {
            n = n / 10;  // 先去掉右边的k-1个数字
        }
        return n % 10;  // 剩下的最后一位就是要找的数字
    }
    
    int main() {
        int n, k;
        cin >> n >> k;
        cout << digit(n, k) << endl;
        return 0;
    }
    

    复杂度分析

    • 每做一次除法就去掉一位数字,一共要做 k-1 次除法,所以时间复杂度是 O(k)。
    • 我们只用了几个变量,空间复杂度是 O(1)。

    k 最大也就是 n 的位数,所以程序运行非常快!

    • 1