3

私がやろうとしていること:

  1. 関数を呼び出すときにユーザーが指定return_length=Trueした場合、回文数に到達するためにアルゴリズムが必要とするステップ数に 1 を加えた値を返す必要があります。たとえば、5280 と を入力するとreturn_length=True、関数は 4 を返す必要があります (これは、シーケンス [5280、6105、11121、23232] のエントリの総数であることに注意してください)。たとえば、入力が 11 の場合、関数は 1 を返す必要があります。これは、既に回文数であるためです。

  2. ユーザーが を指定しなかった場合、return_lengthまたは を指定した場合return_length=False、関数はアルゴリズムが終了する回文数を返す必要があります。たとえば、入力が 5280 の場合、アルゴリズムは 23232 (文字列ではなく整数) を返す必要があります。同様に、89 を入力すると、整数 8813200023188 が返されます。

196 アルゴリズムの背景:

2 桁以上の任意の正の整数を取り、桁を逆にして、元の数に加算します。これは、反転してから追加するシーケンスの操作です。回文数が得られるまで、得られた合計で手順を繰り返します。この手順により、ほとんどの整数に対して回文数がすばやく生成されます。たとえば、数値 5280 で開始すると、5280、6105、11121、23232 のシーケンスが生成されます。アルゴリズムを 1、2、3、... に適用すると、最終結果は 1、2、3、4、5、6、7 になります。 、8、9、11、11、33、44、55、66、77、88、99、121、... (スローンの A033865)。89 の値は特に大きく、8813200023188 です。 ( http://mathworld.wolfram.com/196-Algorithm.htmlより)

私がこれまでに持っているもの:

def alg196(x, y = false):
   if y==False:
      while x == x[::-1]:
         x==x+x[::-1]
      return x
   else:
      seq = [x]
      while x == x[::-1]:
         x==x+x[::-1]
      seq.append(x)
   return seq

エラーが発生します:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_36.py", line 10, in <module>
    exec compile(u"print _support_.syseval(python, u'alg196(34)', __SAGE_TMP_DIR__)" + '\n', '', 'single')
  File "", line 1, in <module>

  File "/sagenb/sage_install/sage-5.3-sage.math.washington.edu-x86_64-Linux/devel/sagenb-git/sagenb/misc/support.py", line 487, in syseval
    return system.eval(cmd, sage_globals, locals = sage_globals)
  File "/sagenb/sage_install/sage-5.3-sage.math.washington.edu-x86_64-Linux/local/lib/python2.7/site-packages/sage/misc/python.py", line 56, in eval
    eval(z, globals)
  File "", line 1, in <module>

  File "", line 3, in alg196

TypeError: 'int' object has no attribute '__getitem__'

この問題またはエラーを正確に修正する方法がわかりません。

回答の情報をいくつか取得すると、次の新しいコードがあります。

    def alg196(x, y = false):
if y==False:
    while str(x) == str(x)[::-1]:
       x=str(x)+str(x)[::-1]
    return x
else:
    seq = [x]
    while str(x) == str(x)[::-1]:
        x = str(x)+str(x)[::-1]
    seq.append(x)
return seq

しかし、まだ回文数の回文数または回文数へのシーケンスを取得していません..

4

3 に答える 3

4

x[::-1]数値では機能しません:

>>> 42[::-1]
TypeError: 'int' object has no attribute '__getitem__'

それを文字列に変換し、逆にしてから、次のように変換する必要がありますint

>>> int(str(42)[::-1])
24

第二に、ライン

x==x+x[::-1]

絶対に何もしません。=混同しないでください。==

于 2012-11-13T20:33:03.513 に答える
2

このようなもの:

def algo(r,ret_len=None):
   count=0
   while 1:
      r=str(r)
      if r==r[::-1]:
         break
      else:
         count+=1
         r=int(r)+int(r[::-1])
   return count+1 if ret_len else r

print (algo(5280,True))
print (algo(5280))
print (algo(89,True))
print (algo(89))

出力:

4
23232
25
8813200023188
于 2012-11-13T20:39:44.397 に答える
1

整数の「スライス」を取得することはできません。最初に文字列に変換する必要があります。 x[::-1]<-- x が整数の場合、この操作は不正です。

ちなみに、これはいくつかの関数、つまり計算を実行する関数と、特定の制約の下で関数を実行し、return_length=True 引数を受け取る関数として記述した方がよいでしょう。

def reverse(n):
    return int(str(n)[::-1])

def is_palindrome(n):
    return str(n) == str(n)[::-1]

def alg196(n, return_length=False):
    results = [n]
    while not is_palindrome(results[-1]):
        results.append(n + reverse(n))
        n = results[-1]
    return results[-1] if not return_length else len(results)

編集

Ashwini Chaudhary のコードに基づく、わずかに速いバリエーション。上記のバージョンは結果のリストを生成します。中間の数値で何かをしたい場合に便利です。しかし、次の関数は読みやすさと速度の間の最良の妥協点だと思います。なぜ彼が始めるのか私にはわかりませんcount=0

def alg196(n, return_length=False):
    count = 1
    while not is_palindrome(n):
        n = n + reverse(n)
        count += 1
    return count if return_length else n
于 2012-11-13T20:34:20.127 に答える