第 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 位数字,等价于先整除 n / 10^(k-1) % 10。位权
参考代码
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;
}