2016-09-07 7 views
0

私はキース番号を見つけるためのPythonプログラムを作ろうとしています。あなたはキース番号が何であるかない場合は、ここでそれらを説明するリンクがある: Keith Numbers - Wolfram MathWorldキース番号が見つからないためのPythonスクリプト

私のコードは、それが出力されたエラーをしませんが、それだけで

18 
9 
9 
[18] 
を出力

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 

です

誰かがなぜ整数の範囲内でキースの数字を繰り返し見つけるだけではないのか教えてください。

答えて

1

プルーンは、すでにあなたに良いアドバイスを与えています!

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) 

、このようなスニペットはあなたにこれを与える:あなたは、nはキース番号やないし、また、いくつかのキース番号を印刷するためのテストループであるかどうかを判断するアルゴリズムを得たとしましょう、のは、彼はしかし何を意味するのかの小さな例を入れてみましょう:

[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 

結論:私は、あなた自身のコードをデバッグする方法を学習アドバイスしたいです代わりにそれについて見知らぬ人に尋ねる;-)

+0

すごく、私はデバッグにもっと取り組んで、私は何が起こっているのかについての明確なアイデアを持っているので、私は再びプログラムを開始します – malteasy

+0

@renzenええ、それは良い態度です!あなたはすぐに自分でこれらの問題を解決することが、あなたに解決策を与える他のものよりもはるかに有益であることを理解するでしょう。良い質問ですが、私は今までキース数を知らなかった:D – BPL

3

あなたはあなたの前にそれを持っている:

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

あなたは出力なしと無限ループにしています。 の場合は、一度になります。この後、は私値1を通る、2、およびのためのループを通る3.たびに、すべての3つのかの条件がです。変更するものはありません。ループの場合はから抜け出し、の場合はの先頭に戻ります。ここでは、番のを['9']に戻し、永遠にループします。変数の値を見て、デバッガを通じてシングルステップに学ぶ:

  1. 基本的なデバッグは:

    は、私はあなたが2つのスキルを学ぶことを示唆しています。代わりに、あなたの論理を紙にトレースし、意味のある印刷のステートメントを覚えてください。 (私のこのバージョンはこの回答の最下部にあります)

  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 
関連する問題