用长除法逐位模拟:每轮余数乘 10 除以 b 得到当前位小数,循环 n 次即得第 n 位,余数恒小于 b 不会溢出。
OJ: roj
题目 ID: 1082
难度:入门
标签:数学数论大整数
创建: 2026-09-29 17:54
更新: 2026-10-05 00:27
题目描述
分数 1 2 1,样例输出 5。
思路
用长除法逐位模拟:余数初值为
参考代码
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 17:55
# update_at: 2026-09-29 17:55
import sys
def solve() -> None:
a, b, n = map(int, sys.stdin.buffer.read().split())
# 第 n 位小数 = floor(a·10ⁿ/b) 的个位:一次大整数除法直接取位,无需逐位模拟
print(a * 10**n // b % 10)
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 00:27
* update_at: 2026-10-05 00:27
*/
#include <iostream>
using namespace std;
typedef long long ll;
ll a, b, n; // 输入:分数 a/b 的小数点后第 n 位
int main() {
cin >> a >> b >> n;
// 模拟长除法:每轮把余数乘 10 再对 b 取商,商就是这一位小数
ll remainder = a; // 当前余数,初始为分子 a
ll digit = 0; // 第 n 位小数的数字
for (ll i = 1; i <= n; i++) {
remainder = remainder * 10;
digit = remainder / b;
remainder = remainder % b;
}
cout << digit << endl;
return 0;
}