【问题标题】:Python script for finding keith numbers not working用于查找基思数的 Python 脚本不起作用
【发布时间】:2016-09-07 22:34:53
【问题描述】:

我正在尝试制作一个可以找到基思数字的 python 程序。如果你不知道基思数字是什么,这里有一个解释它们的链接: 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]

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

【问题讨论】:

    标签: python python-2.7 math numbers


    【解决方案1】:

    你面前有它:

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

    您处于没有输出的无限循环中。你得到这个一次。在此之后,i 遍历值 1、2 和 3。每次通过 for 循环,所有三个 if 条件都是 >错误。什么都没有改变,你退出 for 循环,回到 while 的顶部。在这里,您将 numbers 设置回 ['9'],然后永远循环。

    我建议你学习两个技能:

    1. 基本调试:学习单步调试器,查看变量值。或者,学习在纸上追踪你的逻辑并坚持有意义的print语句。 (我的版本在这个答案的底部。)
    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
    

    【讨论】:

      【解决方案2】:

      Prune 已经给你很好的建议了!让我们举一个他的意思的小例子,假设你有一个算法来确定 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)
      

      这样的 sn-p 给你这个:

      [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]
      --------------------------------------------------------------------------------
      

      哇,太棒了...但是等等,假设您不了解 keith_number 函数,并且您想稍微探索一下该算法以了解其内容。如果我们添加一些有用的调试行呢?

      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
      

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

      【讨论】:

      • 太棒了,我会在调试方面做更多的工作,我会再次启动程序,这样我就可以清楚地知道发生了什么
      • @renzen 是的,态度很好!你很快就会意识到自己解决这些问题比别人给你解决方案更有价值。好问题,但我直到现在才知道基思数字:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2016-04-12
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多