<p>如果您给它一个数字N,它将生成1234…N或N…4321,但输出不是作为字符串,而是作为数字。我想把中间的循环转换成列表理解,但在尝试时遇到了麻烦。在</p>
<p>下面是运行的代码(用Python2.7编写:</p>
<pre><code>def findTens(N):
# counts number of tens in a number: examples:
# * 100 & 113 would both return 2
# * 9 returns 0
# * 14 returns 1
incrementer = 1
while True:
if N - 10**incrementer < 0:
break
else:
incrementer += 1
if incrementer == 100:
break # debugging condition
return incrementer - 1
def create_seqNum(N, reverse=False, showWork=False, returnDescr=False, divLength=100):
'''create_seqNum() --> iput N, and get back a number built from the sequence of 1234...N
Arguments: reverse=True to get the sequence in revers, showWork=True to see numbers that add up to final,
returnDescr=True to print the answer in a sentence as well as returning it as a number.'''
num = 0
tensIncr = 0
answer = 0
Ntens = findTens(N)
modifier = 0 # modifies counter when increment of 10 occurs
if reverse == True: # create range builder inputs
rstart = 1
rend = N+1
rinc = 1
else:
rstart = N
rend = 0
rinc = -1
for i in range(rstart, rend, rinc):
itens = findTens(i)
num = i * 10**tensIncr
tensIncr += 1 + itens
pad = (Ntens - itens)
if showWork == True:
print(("For %d" + " "*pad + " Add: %d") %(i, num))
answer += num
if showWork == True:
print("#"*divLength)
if showWork == True or returnDescr == True:
print("Answer: %d" %answer)
print("#"*divLength)
return answer
</code></pre>
<p>这些测试用例都使用上述代码:</p>
^{pr2}$
<p>还请注意,我创建工作列表理解的尝试失败了,因为我在计算中取消了循环,并且使它能够得到它加起来的数字列表以及最终的总和(“showWork”选项)。但如果没有人能同时解决这两个问题,那么通过所有测试的最佳计算方案将被接受。在</p>
<p>万一有帮助的话,我尝试把它转换成失败的列表理解。如果有人能找到答案,希望从你的答案中学习,并认为其他人可能会发现这个有趣的谜题(至少我希望):</p>
^{3}$
<p>这一挑战的来源和背景:</p>
<p>在HackerRank上,他们让你简单地不使用字符串来解决N=123…N,他们接受一个简单的一行打印格式语句作为答案。虽然使用python3.x打印参数与解包列表相结合可以更有效地解决这个问题,但我对是否可以构建数字感兴趣,因为它是一个不需要进行任何字符串转换的数字。由于<code>print()</code>我认为在输出内容之前先将其转换为string,所以我觉得从纯学术的角度来看,这是一种更有趣的方法。在</p>
<p>呃,那么,这看起来像是癌症,但我认为它有效</p>
<pre><code>def get_seq(n):
return sum([(m+1)*10**(m + [sum([k/10 for k in range(n)][:i+1]) for i in range(len([j/10 for j in range(n)]))][m]) for m in range(n)])
</code></pre>