网址: www.nowcoder.com/practice/29…
描述
数字以 0123456789101112131415... 的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类题,请你输出第 n 位对应的数字。
数据范围: 0 \le n \le 10^9 \0≤n≤109
public:
int findNthDigit(int n) {
int sum0=0;
long long sum1=0;
int l=1; //l是第n位所在自然数的长度
for(;;l++)
{
sum1=sum1+l*9*(pow(10,l-1));
if(sum1>=n)
{
break;
}
sum0=sum1; //sum0是长度为l-1及以下的自然数所占的总位数
}
int j=(n-sum0)/l; //在sum0位和n位之间有j个长度为l的自然数
int x=n-sum0-l*j; //第n位就是所在自然数的第x位
int npre=pow(10,l-1)+j-1; //npre是所在自然数的前一个数
if(x==0) //若x为0,说明第n位是前一个自然数的最后一位
return npre%10;
else return (npre+1)/(int(pow(10,(l-x))))%10;
}
};//自然数是指按题目中的顺序组成该字符序列的每个数,比如“11121314”中的11和12都分别是自然数
总结: 要求出第n个位所在的那个自然数,先根据n这个位数,求出这个数字的长度(也就是l),然后利用n与sum0的差求出所在的那个自然数