求小数的某一位

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

用长除法逐位模拟:每轮余数乘 10 除以 b 得到当前位小数,循环 n 次即得第 n 位,余数恒小于 b 不会溢出。

OJ: roj

题目 ID: 1082

难度:入门

标签:数学数论大整数

创建: 2026-09-29 17:54

更新: 2026-10-05 00:27

题目描述

分数 a/ba/b 化为小数后,求小数点后第 nn 位的数字。输入三个正整数 a、b、na、b、n(0<a<b<1000<a<b<100,1⩽n⩽100001 \leqslant n \leqslant 10000),输出一个数字。样例输入 1 2 1,样例输出 5。

思路

用长除法逐位模拟:余数初值为 aa,每轮把余数乘 1010 除以 bb 即得当前位数字,余数取模后继续下一轮,循环 nn 次得到第 nn 位。余数恒小于 b<100b<100,运算不会溢出。

参考代码

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;
}