题目:
题解:
对于这个题,我们其实刚看到全都么有思路。但是细心的人就可能会发现其中是有规律的。我在测试的时候,使用暴力的解法只能通过六个点,所以这个题还是要我们来进行寻找规律。
因为这个序列每一部分都是由1到n组成。所以当啷个相邻的n与n+1的位数相同的时候,每一个1到n的序列其实是等差数列。因此我们就可以使用等差序列来进行求和的计算,计算总共数列的长度。
既然我们将其看作等差数列,那么我们就要先寻找要找的位置在哪一项中。
也就是k的位置大于前n项的长度,小于前n+1项的长度的时候,他就在1-n+
1这一项中。
找到属于第几项,我们通过该项的位置减去前面的长度,就是这个位置,在这一项里面的位置。
找到一项里面的位置,我们就通过每位数级的项数找到他的位置,之后从一个数中使用他的位置找到这个数。
完整代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include<queue>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
long long len1(long long x) //反回x第一次出现 时,前面的总长度
{
long long d=0; //位数;
long long n=0; //在每一位数上有多少项 1~9有9项;10~99有9