我被要求做以下事情:
使用while循环,您将编写一个程序,该程序将产生以下数学序列:
1 * 9 + 2 = 11(您将计算此数字)
12 * 9 + 3 = 111
123 * 9 + 4 = 1111
然后你的程序应该运行,只要结果只包含“1”。您可以将数字构建为字符串,然后在计算之前转换为整数。然后,您可以将结果转换回字符串,以查看它是否包含所有“1”。
示例输出:
1 * 9 + 2 = 11
12 * 9 + 3 = 111
123 * 9 + 4 = 1111
1234 * 9 + 5 = 11111
这是我的代码:
def main():
Current = 1
Next = 2
Addition = 2
output = funcCalculation(Current, Addition)
while (verifyAllOnes(output) == True):
print(output)
#string concat to get new current number
Current = int(str(Current) + str(Next))
Addition += 1
Next += 1
output = funcCalculation(Current, Next)
def funcCalculation(a,b):
return (a * 9 + b)
def verifyAllOnes(val):
Num_str = str(val)
for ch in Num_str:
if(str(ch)!= "1"):
return False
return True
main()
错误是公式不会在每行的系列文件旁打印。我做错了什么?
答案 0 :(得分:2)
的伪代码:
a = 1
b = 2
result = a * 9 + b
while string representation of result contains only 1s:
a = concat a with the old value of b, as a number
b = b + 1
result = a * 9 + b
这可以直接转换为Python代码。
答案 1 :(得分:1)
嗯,对于初学者来说,这是一个简单的方法来检查值是否为全部:
def only_ones(n):
n_str = str(n)
return set(n_str) == set(['1'])
你可以做更多的事情" mathy"但我不确定它会更快。它会更容易 如果那是你感兴趣的东西,那么推广到其他基础(超过10个)
def only_ones(n):
return (n % 10 == 1) and (n == 1 or only_ones2(n / 10))
至于实际解决问题的方法,实际上并不清楚序列应该是什么。
接下来会发生什么?
123456
1234567
12345678
123456789
?
是1234567890吗?还是12345678910?还是1234567900? 如果不回答这个问题,就不可能以任何一般方式解决问题(除非实际上是111..s 在你遇到这个问题之前终止。)
我将采用最具数学吸引力的假设,即所讨论的价值是 它之前的所有11111 ...值的总和(注意12 = 11 + 1,123 = 111 + 11 + 1,1234 = 1111 + 111 + 11 + 1等等)。
在这种情况下,你可以沿着这些方向做点什么:
def sequence_gen():
a = 1
b = 1
i = 2
while only_ones(b):
yield b
b = a*9 + i
a += b
i += 1
请注意,我已将其放入生成器中,以便更轻松地从中获取尽可能多的结果 你真正想要的顺序。完全有可能这是一个无限的序列,所以实际上正在运行 while代码本身可能需要一段时间; - )
s = sequence_gen()
s.next() #=> 1
s.next() #=> 11
生成器为您提供了很多灵活性。例如,您可以使用itertools.islice
获取序列的前10个值
功能:
import itertools as it
s = sequence_gen()
xs = [x for x in it.islice(s, 10)]
print xs