1 条题解
-
0
思路与算法
在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