题目
话说一天,Dragon.Dai大菜和整个OIBH QQ群的超级大牛同心协力,终于进入了Vijos的系统,并设置了重重机关……
等到V某带着柯南来到服务器准备检查Log(即是日志文件)时,才发现Log文件被加了密,密码是一个数列中的指定一位……(数列见下)经过V某及柯南的思考,总算破解了密码,看到了Log。
数列:12345678910111213………..
输入是一个数$n$,表示求数列的第$n$位
1<=$n$<=10^8
题解
[例子中所有提到的位数已加粗或斜体加粗,请对应后面提到的位数的字形]
先确定这个位置的每个数字有多少位,例如【1234567891011213】中第5位数字为1位数,第12位数字为2位数。可以直接用范围来确定,详见下图。图中第一行是数字的位数,第二行为这个位数的数字的最后一位在整个数列中是第几位,至于怎么用它确定位数就不用说了吧,实在不会看代码吧。
然后要确定它的值,也就是获取这一位在这个位数的数字中是第几位(例如【1234567891011213】,第12位就是这个位数(2位数)中的第3位),然后除以数字的位数(取整),此时你获得了这个数是这个位数的数字中的第几个(0起计数)。(例如第12位,是两位数中的第三位,除数字位数2,去整,值为1),然后加上前面(位数-1)的数字个数,即为结果,但是这个结果只是这整个数,你需要输出的是:(所求位数-上一位最后一位在整个数列中是第几位)取余当前位数,若取余结果为0请输出这整个数的最后一位,例如若这个数是123,你要求的那一位取余后为0,请输出3。
说得可能有点乱,请看代码。
代码
|
|