倒数定义为:
倒数是一个整数,其中
左边的第个数字加上i
右边的第个数字是
总是等于10例如,13579是一个倒数,因为1+9=10,3+7=10和(因为
5是从左到右的第三位数字)5+5=10。
前几个倒数,按数字顺序,是5,19,28,37,…,82,91,159…
任务
编写一个程序来确定第n个倒数(按数字顺序)。
输入将由单个整数n(1
我的代码def upsidecheck(tocheck):
intolist=list(map(int, str(tocheck)))
x=0
while x<(len(intolist)/2):
if (intolist[x]+intolist[len(intolist)-x-1])!= 10 :
return False
break
x+=1
return True
print("which nth upsidedownnumber do you want?")
nth=int(input())
y=0
answer=0
for x in range (1,(2**31)):
counter=upsidecheck(x)
if counter == True:y+=1
if y==nth:answer=x;break
print("the answeris",answer)
对于小于100的数字,该代码是正确的,但是对于大小为“1234”的数字,它需要在两秒钟内运行,这将得到“4995116”的答案。
它确实能工作,但只是时间太长(通常大约30秒),需要在2秒内工作;(
提前谢谢你的帮助。
注意:这不是为了考试/家庭作业等,只是为了帮我准备考试
最佳答案
首先,我们需要一个函数来告诉我们哪些数字是颠倒的:
def is_ud(n):
digits = [int(ch) for ch in str(n)]
check = (len(digits) + 1) // 2
return all(digits[i] + digits[-1 - i] == 10 for i in range(check))
然后,让我们生成一些值并查找模式:
ud = [i for i in range(10000000) if is_ud(i)]
for digits in range(1, 8):
lo, hi = 10 ** (digits - 1), (10 ** digits) - 1
answers = sum(lo <= n <= hi for n in ud)
print("{}: {}".format(digits, answers))
它给予
1: 1
2: 9
3: 9
4: 81
5: 81
6: 729
7: 729
所以有81个4位数的解决方案,729个6位数的解决方案;这应该是有意义的,因为6位数的解决方案看起来像“1”+(每个4位数的解决方案)、“9”、“2”+(每个4位数的解决方案)、“8”9“+(每个4位数的解决方案)+”1“-因此,每个4位数的解决方案有9个6位数的解决方案(如果您以这种方式生成它们,您将以升序生成它们)。同样,对于每一个4位数的解决方案,通过在中间粘贴一个5,有一个相应的5位数解。
看看这个表,您现在应该可以看到,如果您想要(例如)第200个解决方案,它必须有6位数;事实上,它必须是第19个6位数的解决方案。更重要的是,因为19现在您已经拥有了编写递归解决方案以直接生成第n个倒数所需的一切。祝你好运!
关于python - python倒数难题。需要效率的协助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27432015/