digit函数

GitHub跳转原题关系图返回列表

第 k 位数字就是 n 整除 10^(k-1) 之后对 10 取余。

OJ: roj

题目 ID: 1164

难度:入门

标签:入门数学python

创建: 2026-09-29 21:37

更新: 2026-10-05 04:06

题目描述

定义函数 digit(n,k),分离出整数 n 从右边数第 k 个数字(个位算第 1 个)。输入一行两个正整数 n 和 k,输出对应的一个数字。例如输入 31859 3,输出 8。

思路

从右往左数第 k 位数字,等价于先整除 10k−110^{k-1} 砍掉低 k−1k-1 位,再对 10 取余取出新的末位,即答案为 n / 10^(k-1) % 10。位权 10k−110^{k-1} 用循环连乘算出即可,无需特判边界。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 21:40
# update_at: 2026-09-29 21:40

import sys


def digit(n: int, k: int) -> int:
    """返回整数 n 从右往左数第 k 个数字(个位是第 1 个)。

    题面的递归 f(n,k) 每层做一次 n//10 并让计数加一,等价于先在末位之前砍掉
    k-1 位、再取新的末位:砍掉 k-1 位是 10^(k-1) 整除,取末位是对 10 取余。
    """
    return n // 10 ** (k - 1) % 10


def solve() -> None:
    n, k = map(int, sys.stdin.buffer.read().split())
    print(digit(n, k))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 04:06
 * update_at: 2026-10-05 04:06
 */
#include <cstdio>

typedef long long ll;

ll n; // 题目给的整数
ll k; // 要取从右往左数第 k 个数字(个位是第 1 个)

int main() {
    scanf("%lld %lld", &n, &k);
    // 第 k 位 = 先整除 10^(k-1) 砍掉低 k-1 位,再对 10 取余取出新的末位
    ll p = 1; // p 表示位权 10^(k-1),用循环连乘算出
    for (ll i = 1; i <= k - 1; i++)
        p = p * 10;
    printf("%lld\n", (n / p) % 10);
    return 0;
}