1001人を殺して命を償わない(3 n+1)推測(python)

1402 ワード

知識の敵は無知ではなく、すでに知識を身につけた幻覚である.       
タイトル:
カラズ(Callatz)は、正の整数nのいずれかに対して、偶数であれば、半分を切ると推測している.奇数であれば(3 n+1)を半分切ります.こうやって切り落としを繰り返し、最後には必ずある一歩でn=1を得る.カラズは1950年の世界数学者大会でこの推測を発表した.当時、エール大学の教師と学生が一斉に動員され、馬鹿みたいで無邪気な命題を証明しようとしたが、結局学生たちは学業に専念せず、ひたすら証明しただけだったという.(3 n+1)陰謀だという人もいる.カラズは米国の数学界の教育と科学研究の進展を遅らせようとしたのだ.
私たちの今日のテーマはカラズの推測を証明するのではなく、与えられたいずれかの1000を超えない正の整数nに対して、簡単に数えて、n=1を得るにはどのくらいのステップ(何回切る)が必要ですか?
入力形式:
各テスト入力には、正の整数nの値を与えるテスト例が1つ含まれる.
出力フォーマット:
nから1までの計算に必要なステップ数を出力します.
考え方:
  • 余剰判定パリティ、条件判定奇数偶数偶数それぞれが実行するプログラムは、変数カウントにより出力回数
  • である.
  • 特殊な場合の判別は、例えば入力が1の場合、プログラムカウントは0であるが、
  • を1回出力.
  • 最初はコードフォーマットが分からなかったので、入力inputが必要で、直接printを出力すればいい
  • です.
    n = int(input())
    num = 0
    if n == 1:
        print(num)
    if n>1 and n<=1000:
        while True:
            s = n % 2
            if s ==0:
                n = n/2
            else:
                n = (3*n + 1)/2
            num = num + 1
            if n == 1:
                break
        print(num)
    

    全部で5回提出しましたが、いくつかの問題に注意していません.
  • コードロジックは明らかにされておらず,余剰判定はループ条件として毎回変化しなければならない.
  • 要求入力0-1000以内、入力判断していない(判断しなくてもいい!!)
  • 特殊な状況は考慮していないで、入力が1の時で、0回で、ここで私は直接0を出力して、人工的に判断して、感じはよくありません
  • 修正後は21 ms
    n = int(input())
    num = 0
    while n!=1:
        s = n % 2
        if s ==0:
            n = n/2
        else:
            n = (3*n + 1)/2
        num = num + 1
        if n == 1:
            break
    print(num)