Python-100-Days学習記録5日目

6000 ワード

Python-100-Days学習記録
元のプロジェクトのアドレス:https://github.com/jackfrued/Python-100-Days
Day5
練習する
  • 「水仙の花の数」
  • を探しています
    水仙花数(Narcissistic number)は超完全数字不変量(pluperfect digital invariant,PPDI)、ナルシスト数、自べき乗数、アムス壮数またはアムストロング数(Armstrong number)とも呼ばれ、水仙花数は1つの3桁を指し、その各桁の数字の3乗の和はそれ自体に等しい(例えば:1^3+5^3+3+3^3=153).
    for i in range(100, 1000):
        x = i // 100
        y = (i - 100 * x) // 10
        z = i - 100 * x - 10 * y
        if(x * x * x + y * y * y + z * z * z == i):
            print(i)
    

    実行結果:
    PS E:\Nproject> python day5-1.py
    153
    370
    371
    407
    

    1回変更:
    for i in range(100, 1000):
        x = i // 100
        y = (i - 100 * x) // 10
        # z = i - 100 * x - 10 * y
        z = i % 10 # %    
        # if(x * x * x + y * y * y + z * z * z == i):
        if i == x ** 3 + y ** 3 + z ** 3: # **         
            # print(i)
            print(i, end = ' ')
    

    実行結果:
    PS E:\Nproject> python day5-1.py
    153 370 371 407
    
  • 「完璧な数」
  • を探しています
    それぞれがその約数(真約数、ある数の約数をリストし、その数自体を除いて、残りはその真約数)以下のものと、それ自体に等しい自然数を完全数(Perfect number)と呼び、完璧数または完備数とも呼ばれる.
    end = int(input('            :'))
    for i in range(2, end):
            s = 0
            for j in range(1, i):
                    if i % j == 0:
                            s += j
            if s == i:
                    print(i, end = " ")
    

    実行結果:
    PS E:\Nproject> python day2-1.py
                :10000
    6 28 496 8128
    

    1回変更:
    end = int(input('            :'))
    # for i in range(2, end):
    for i in range(1, end): # range(1, 1)      ,    
            # s = 0
            s = [] #       
            for j in range(1, i):
                    if i % j == 0:
                            # s += j
                            s.append(j) 
            # if s == i:
            if sum(s) == i: # sum()   
                    print(i, end = " ")
    
  • 「百元百鶏」問題
  • わが国の古代数学者の張丘建が『算経』という本の中で提出した数学問題:鶏翁は1価5、鶏母は1価3、鶏雛は3価1.百元で百鶏を買って、鶏翁、鶏母、鶏雛の各幾何学を聞きますか?
    for x in range(101):
            for y in range(101 - x):
                    z = 100 - x - y
                    if z % 3 == 0 and z / 3 + 5 * x + 3 * y == 100:
                            print('  %d ,  %d ,  %d ' % (x, y, z))
    

    実行結果:
    PS E:\Nproject> python day2-1.py
      0 ,  25 ,  75 
      4 ,  18 ,  78 
      8 ,  11 ,  81 
      12 ,  4 ,  84 
    

    1回変更:
    # for x in range(101):
    for x in range(20): #     
            # for y in range(101 - x):
            for y in range(33):
                    z = 100 - x - y
                    if z % 3 == 0 and z / 3 + 5 * x + 3 * y == 100:
                            print('  %d ,  %d ,  %d ' % (x, y, z))
    
  • フィボナッチ数列
  • を生成する
    フィボナッチ数列は、黄金分割数列、レオナルド・フィボナッチがウサギの繁殖を例に導入したことから「ウサギ数列」とも呼ばれ、1、1、2、3、5、8、13、21、34、・・・数学的には、フィボナッチ数列は、F(1)=1、F(2)=1、F(n)=F(n-1)+F(n-2)(n>=3、n∈N*)
    def fib(i):
            if i <= 0:
                    print('error')
                    return 0
            elif i == 1 or i == 2:
                    return 1
            else:
                    return fib(i - 1) + fib(i - 2)
    
    for n in range(1, 20):
            print(fib(n), end = ', ')
    print(fib(20))
    

    実行結果:
    PS E:\Nproject> python day5-4.py
    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765
    

    1回変更:
    a = 0 
    b = 1
    for i in range(20):
            a, b = b, a + b
            print(a, end = ' ')
    

    関数を使用しないと速度が大幅に向上します.
  • craps賭博ゲーム
  • ルール:プレイヤーはサイコロを2つ投げ、各サイコロの点数は1-6で、最初の点数と7または11であれば、プレイヤーは勝つ.ポイント和が2、3または12の場合、プレイヤーは荘家に負けて勝つ.和が他の点数であれば、1回目の点数とを記録し、プレイヤーはサイコロを投げ続け、点数と1回目の投げた点数と等しいまでプレイヤーが勝つ.投げた点数と7なら荘家勝.
    from random import randint
    
    x = randint(1, 6)
    y = randint(1, 6)
    _sum = x + y
    
    if _sum == 7 or _sum == 11:
            print('%d,     ' % _sum)
    elif _sum == 2 or _sum == 3 or _sum == 12:
            print('%d,     ' % _sum)
    else:
            while(1):
                    x = randint(1, 6)
                    y = randint(1, 6)
                    _sum2 = x + y
                    if _sum2 == _sum:
                            print('%d,     ' % _sum2)
                            break
                    elif _sum2 == 7:
                            print('%d,     ' % _sum2)
                            break
    

    実行結果:
    PS E:\Nproject> python day2-1.py
    7,     
    PS E:\Nproject> python day2-1.py
    7,     
    PS E:\Nproject> python day2-1.py
    3,     
    PS E:\Nproject> python day2-1.py
    7,     
    PS E:\Nproject> python day2-1.py
    6,     
    PS E:\Nproject> python day2-1.py
    7,     
    PS E:\Nproject> python day2-1.py
    7,     
    PS E:\Nproject> python day2-1.py
    7,     
    PS E:\Nproject> python day2-1.py
    6,     
    PS E:\Nproject> python day2-1.py
    11,     
    

    1回変更:
    from random import randint
    
    money = 1000
    while money > 0:
            print('      :', money)
            needs_go_on = False
            while True:
                    debt = int(input('   :'))
                    if debt > 0 and debt <= money:
                            break
            first = randint(1, 6) + randint(1, 6)
            print('     %d ' % first)
            if first == 7 or first == 11:
                    print('    ')
                    money += debt
            elif first == 2 or first == 3 or first == 12:
                    print('    ')
                    money -= debt
            else:
                    needs_go_on = True
    
            while needs_go_on:
                    current = randint(1, 6) + randint(1, 6)
                    print('     %d ' % current)
                    if current == 7:
                            print('    ')
                            money -= debt
                            needs_go_on = False
                    elif current == first:
                            print('    ')
                            money += debt
                            needs_go_on = False
    
    
    print('    ,     !')