循环生成数学序列?

时间:2014-05-06 23:56:33

标签: python while-loop

我被要求做以下事情:

使用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()

错误是公式不会在每行的系列文件旁打印。我做错了什么?

2 个答案:

答案 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