definitDig(n,dig=10): weight=[int(10**(i-1)+(9*10**(i-2))*(i-1)) for i inrange(1,dig)] accumulate=[weight[0]] for i inrange(1,len(weight)): accumulate.append(weight[i]+accumulate[-1]) # 检查在哪个范围 l,r=0,len(accumulate) while l<=r: mid=(r-l)//2+l if accumulate[mid]>=n: r=mid-1 else: l=mid+1 remain=n-accumulate[l-1] if l==0: return [1],0 return [1]+[0]*l,remain print(initDig(2021)) # ([1, 0, 0, 0], 1721)
for i inrange(1,len(weight)): accumulate.append(weight[i]+accumulate[-1]) # 检查在哪个范围 l,r=0,len(accumulate) while l<=r: mid=(r-l)//2+l if accumulate[mid]>=n: r=mid-1 else: l=mid+1 remain=n-accumulate[l-1] if l==0: return [1],0 return [int(i) for i instr(hashmap[l-1])],remain
definitDig(n): weight=[1,19] # 个位十位 weight+=[120]+[20for i inrange(1,9)] # 百位 weight+=[1300]+[300for i inrange(1,9)] # 千位 hashmap=[1,10,200]+[100*i+200for i inrange(1,9)]+[2000]+[1000*i+2000for i inrange(1,9)] # weight=[int(10**(i-1)+(9*10**(i-2))*(i-1)) for i in range(1,dig)] accumulate=[weight[0]] for i inrange(1,len(weight)): accumulate.append(weight[i]+accumulate[-1]) # 检查在哪个范围 l,r=0,len(accumulate) while l<=r: mid=(r-l)//2+l if accumulate[mid]>=n: r=mid-1 else: l=mid+1 remain=n-accumulate[l-1] if l==0: return [1],0 return [int(i) for i instr(hashmap[l-1])],remain print(initDig(2021))
defcreateDig(n):
dig,cnt=initDig(n) isOne=0 for i in dig: if i==1: isOne+=1 defCarryBit(dig,isOne): idx=-2 while1: if idx * -1 > len(dig): dig = [1] + dig[:-1] + [0] isOne += 1 break else: v = dig[idx] + 1 if v != 10: dig[idx]=v if v == 1: isOne += 1 if v == 2: isOne -= 1 break dig[idx] = 0 idx -= 1 return dig,isOne i=1 while i<cnt: if isOne==0: # 进位应当是十位加一 # 而当十位是一的时候,应当从零开始 dig,isOne=CarryBit(dig,isOne) if isOne: dig[-1]=0 else: dig[-1]=1 i+=1 else: tem=dig[-1]+1 if tem==1: i+=1 if tem==10: dig,isOne=CarryBit(dig,isOne) if isOne: dig[-1]=tem%10 i+=isOne else: dig[-1]=1 i+=1