1

これが私のコードです:

i=int(input("enter your number"))
j=int(input("enter your number"))
if i>j: #making x always greater than y
    x=i
    y=j
elif i<j:
    x=j
    y=i
else:
    print("invalid")
k=y
cyclelength=[]
while k<=x:
    list=[k]
    while k!=1:
        if(k%2==0):
            k=i//2
        else:
            k=3*k+1
        list.append(k)
    cyclelength.append(len(list))
    k+=1
print(y," ",x," ",max(cyclelength))

次の例外が発生します。

Traceback (most recent call last):
  File "C:/Python32/uva100.py", line 21, in <module>
    list.append(k)
MemoryError
4

4 に答える 4

5

k //= 2あなたは代わりに意味するかもしれませんk=i//2

def cyclelength(k):
    assert k > 0
    count = 1
    while k != 1:
       k = k // 2 if k % 2 == 0 else 3 * k + 1
       count += 1
    return count

k_with_max_cyclelength = max(range(y, x+1), key=cyclelength)

または両方を取得するには:

k, max_cyclelength = max(((k, cyclelength(k)) for k in range(y, x+1)),
                         key=lambda pair: pair[1])
于 2012-07-03T17:08:26.243 に答える
2

このブロックの別の問題:

while k!=1:
    if(k%2==0):
        k //= 2
    else:
        k=3*k+1

終了時の k の値は 1 です。

したがって、k を 2 にインクリメントし、k < x であるため while を再入力し、k を 1 にリセットします。

--> 無限ループ

内部で新しい変数を定義するか、別の関数でこのブロックを抽出する必要があります

于 2012-07-03T17:08:37.070 に答える
0

これは、コラッツ予想で遊んでいるように見えます。試す

def get_int(prompt):
    while True:
        try:
            return int(raw_input(prompt))
        except ValueError:
            pass

def sequence_length(k):
    length = 0
    while k > 1:
        k = 3*k+1 if k&1 else k//2
        length += 1
    return length

def max_sequence_length(lo, hi):
    best_k, best_length = None, 0
    for k in xrange(lo, hi+1):
        length = sequence_length(k)
        if length > best_length:
            best_k, best_length = k, length
    return best_k, best_length

def main():
    lo = get_int("Enter the start number: ")
    hi = get_int("Enter the finish number: ")
    lo, hi = min(lo, hi), max(lo, hi)
    best_k, best_length = max_sequence_length(lo, hi)
    print("In {}..{}, max cycle length is {} at k = {}".format(lo, hi, best_length, best_k))

if __name__=="__main__":
    main()
于 2012-07-03T17:25:59.050 に答える
0

私はあなたが行くと思います

n=y
cyclelength=[]
while n<=x:
    k=n
    list=[k]
    while k!=1:
        if(k%2==0):
            k//=2
        else:
            k=3*k+1
        list.append(k)
    cyclelength.append(len(list))
    n+=1
于 2012-07-03T17:11:17.860 に答える