C++ NOJ 题目 “1” 的传奇
本代码在Code:Blocks 13.12环境下编译通过
noj第三季(枚举)的一道题,第一次写的时候没注意,超时了,就说怎么这么好写(doge)
后来开始找数学规律优化算法,写完后发现运行速度比参考代码还快,于是决定分享一下思路
先贴题
本题难就难受在数比较大时如何找到规律减少不必要的计算
怎么办呢?
注意到1-99(-1)中有20个“1”,1-999(-1)中有300个“1”,1-9999(-1)中有4000个“1”......以此类推,可以猜想出:由1到-1中共有x*个“1”(笔者未证,数归应该可证)
现在我们知道这样的一个规律,也就意味着,对于一个N来说,我们可以对他进行分解,把他从前到后,位数一位位抽出来计算,下面举例来具体说明:
假设N=6792,那么对于1到999时,由规律知,共有300个1,而同样的,从1000到6000的过程中,如果我们不关注首位,那么便发现在每个x000到(x+1)000的区间里,都有300个数,这样的区间由多少呢?6-1=5个,算上1-999,也就是6个区间,总共6*300
共有 0 条评论