1 条题解

  • 0
    @ 2026-10-26 13:00:02

    思路与算法

    在digit(n,k)函数内,先把k的十进制前导0去掉,再与n的文本长度作十进制大小比较。若k没有超过长度,安全转换成size_t,直接访问n[len-k]。n也按文本读入,因此不要求它能装入机器整数。

    正确性说明

    十进制文本从左向右下标从0开始,最右一位下标为len-1;向左移动k-1次得到len-k,正是从右数第k位。先比较k与len,保证下标不会下溢,同时只有k≤len才转换k,因此转换值一定可用size_t表示。合法位数范围内输出唯一对应数字。超过现有位数的分支按隐含前导0返回0,本批测试只使用原题有实际数位的正k。

    复杂度

    设n、k的文本长度分别为L、K。读入与去除k前导0总时间O(L+K),比较和解析k不超过O(K),字符访问O(1)。空间O(L+K),包括输入文本及规范化k;常量变量初始化O(1)。

    易错点

    题目从右边开始计数,且k从1开始。不要用浮点pow求10的幂,既可能溢出也可能有舍入误差。n和k均为正整数,参考函数不为k=0定义数位。测试包含上万位n,避免偷偷把未给的数值域缩为int。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    char digit(const string &n, string k) {
        size_t nz = k.find_first_not_of('0');
        k = nz == string::npos ? "0" : k.substr(nz);
        string cap = to_string(n.size());
        if (k.size() > cap.size() || (k.size() == cap.size() && k > cap))
            return '0';
        size_t index = 0;
        for (char ch : k)
            index = index * 10 + (ch - '0');
        return n[n.size() - index];
    }
    int main() {
        string n, k;
        cin >> n >> k;
        cout << digit(n, k) << '\n';
    }
    
    • 1

    信息

    ID
    1730
    时间
    1000ms
    内存
    64MiB
    难度
    入门
    标签
    递交数
    1
    已通过
    1
    上传者