查找keith数字的Python脚本无效

2024-10-03 09:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个python程序来查找keith数字。如果你不知道基思数字是什么,这里有一个链接解释它们: Keith Numbers - Wolfram MathWorld

我的密码是

from decimal import Decimal
from time import sleep

activator1 = 1

while (activator1 == 1):
    try:
        limit = int(raw_input("How many digits do you want me to stop at?"))
        activator1 = 0
    except ValueError:
        print "You did not enter an integer"


limitlist = []
activator2 = 1

while (activator2 <= limit):
    limitlist.append(activator2)
    activator2 += 1
    print limitlist

add1 = 0
add = 0
count = 9
while 1:
    sleep (0.1)


    numbers = list(str(count))

    for i in limitlist:
        if (i > 0) & (add < count):
            add = sum(Decimal(i) for i in numbers)
            lastnumber = int(numbers[-1])
            add1 = lastnumber+int(add)
            numbers.reverse()
            numbers.pop()
            numbers.append(add1)
            print add1
            print add
            print count
            print numbers
        if (add1 == count):
            print"________________________________"
            print add1
            print count

        elif (i > 0) & (add > count):
            count += 1
            break

它不输出任何错误,但只输出

18
9
9
[18]

有人能告诉我为什么它不能在整数范围内重复找到基思数?你知道吗


Tags: fromimportaddcount数字intdecimalprint
2条回答

李子已经给了你很好的建议!让我们举一个小例子来说明他的意思,假设你有一个算法来确定n是否是基思数,还有一个测试循环来打印一些基思数:

def keith_number(n):
    c = str(n)
    a = list(map(int, c))
    b = sum(a)

    while b < n:
        a = a[1:] + [b]
        b = sum(a)

    return (b == n) & (len(c) > 1)

N = 5
for i in range(N):
    a, b = 10**i, 10**(i + 1)
    print("[{0},{1}]".format(a, b))
    print([i for i in filter(keith_number, range(a, b))])
    print('-' * 80)

这样的片段给了你:

[1,10]
[]
                                        
[10,100]
[14, 19, 28, 47, 61, 75]
                                        
[100,1000]
[197, 742]
                                        
[1000,10000]
[1104, 1537, 2208, 2580, 3684, 4788, 7385, 7647, 7909]
                                        
[10000,100000]
[31331, 34285, 34348, 55604, 62662, 86935, 93993]
                                        

哇,太棒了。。。但是等等,假设你不了解基思数函数,你想探索一下算法,以便理解它的本质。如果我们添加一些有用的调试行呢?你知道吗

def keith_number(n):
    c = str(n)
    a = list(map(int, c))
    b = sum(a)
    print("{0} = {1}".format("+".join(map(str, a)), b))

    while b < n:
        a = a[1:] + [b]
        b = sum(a)
        print("{0} = {1}".format("+".join(map(str, a)), b))

    return (b == n) & (len(c) > 1)

keith_number(14)
print '-' * 80
keith_number(15)

这样你就可以追踪重要的步骤,算法在你的头脑中也会有意义:

1+4 = 5
4+5 = 9
5+9 = 14
                                        
1+5 = 6
5+6 = 11
6+11 = 17

结论:我建议您学习如何调试自己的代码,而不是询问陌生人;-)

就在你面前:

add1  = 18
add   = 9
count = 9
numbers = [18]

你处在一个没有输出的无限循环中。你只需要一次。之后,i遍历值1、2和3。每次通过for循环,所有三个if条件都是False。如果没有更改,则退出for循环,然后返回while的顶部。在这里,您将数字设置回['9'],并永远循环。你知道吗

我建议你学习两种技能:

  1. 基本调试:学习单步调试,查看变量值。或者,学习在纸上追踪你的逻辑,并坚持有意义的打印语句。(我的版本在这个答案的底部。)
  2. 增量编程:写几行代码并让它们工作。你让他们工作之后(用各种输入值和打印的结果进行测试),继续写一些。在本例中,您编写了一大块代码,然后在大约50行中看不到错误。如果以增量方式编写代码,通常可以将问题隔离到最近的3-5行代码中。你知道吗

while True:
    # sleep (0.1)

    numbers = list(str(count))
    print "Top of while; numbers=", numbers

    for i in limitlist:
        print "Top of for; i =", i, "\tadd =", add, "\tcount =", count, "\tadll =", add1
        if (i > 0) & (add < count):
            add = sum(Decimal(i) for i in numbers)
            lastnumber = int(numbers[-1])
            add1 = lastnumber+int(add)
            numbers.reverse()
            numbers.pop()
            numbers.append(add1)
            print "add1\t", add1
            print "add\t", add
            print "count\t", count
            print "numbers", numbers
        if (add1 == count):
            print"________________________________"
            print add1
            print count

        elif (i > 0) & (add > count):
            count += 1
            print "increment count:", count
            break

相关问题 更多 >