第4回の練習問題の解答例¶

練習問題1¶

ある整数のそれぞれの桁の値を大きい順に並べ替えた整数とそれぞれの桁の値を小さい順に並べ替えた整数の差を求めることをカプレカ操作と言います。371のカプレカ操作は731 - 137 = 594です。0を含む場合に最小の整数を求めるときは0を最上位の桁の値とします(205 → 025 → 25)。また、カプレカ操作によって、元の値と等しくなる数をカプレカ数と言います。3桁の整数にカプレカ数はいくつあるでしょうか。

In [2]:
# ヒント
L = [5,2,4]
L.sort()
L
Out[2]:
[2, 4, 5]
In [3]:
for i in range(100,1000):
    y = i
    i = str(i)
    a = int(i[0])
    b = int(i[1])
    c = int(i[2])

    L = [a,b,c]
    L.sort()

    big_n = 100 * L[2] + 10 * L[1] + L[0]
    small_n = 100 * L[0] + 10 * L[1] + L[2]

    x = big_n - small_n

    if x == y:
        print(y)
495

練習問題2¶

自然数nの約数の総和を$\sigma(n)$と表すとき、$\sigma(n)$と$2n$が等しい自然数を完全数といいます。約数は自分自身も含まれるので、自分自身以外の約数を真の約数と言います。12の約数は1, 2, 3, 4, 6, 12ですが、12の真の約数は1,2,3,4,6,です。$\sigma(n) - n$が真の約数の総和です。

6の真の約数は、1, 2, 3なので、1 + 2 + 3 = 6で6は完全数です。同様に、28も完全数です。28の約数の総和は、1 + 2 + 4 + 7 + 14 = 28。

10000以下の完全数を見つけましょう。

In [4]:
for i in range(1,10001):
    tmp = []
    for j in range(1,i+1):
        if i % j == 0:
            tmp.append(j)
    if i * 2 == sum(tmp):
        print(i)
6
28
496
8128

練習問題¶

6人が最初に1000円持っていて、0番から5番までの番号が付いています。サイコロを2個振り、最初のサイコロの出た目の番号の人が2番目のサイコロの出た目の番号の人に10円を支払います。支払う人の所持金が0円の場合は支払う必要はありません。このゲームをたくさん(例えば100000回とか)繰り返すとたくさんお金を持っている人とほとんど持っていない人に別れてしまうことが知られています。

ディクショナリ、range()、for文を用いて、実際に調べて見ましょう。

0から5のランダムな数字は以下で発生することができます。

In [5]:
from numpy.random import randint
randint(6)
Out[5]:
5
In [6]:
M = {0:1000,1:1000,2:1000,3:1000,4:1000,5:1000}

for i in range(100000):
    d1 = randint(6)
    d2 = randint(6)
    if M[d1] != 0:
        M[d1] -= 10
        M[d2] += 10
    
M
Out[6]:
{0: 710, 1: 1280, 2: 940, 3: 1340, 4: 410, 5: 1320}

挑戦してみよう1¶

タクシー数とは、2つの自然数の立方数(3乗)の和としてn通りに表される最小の整数です。Ta(n)と表します。Ta(1)は2つの自然数の立方数の和で1通りの方法で表せる整数で最小の整数なので、

$$ Ta(1) = 1^{3} + 1^{3} = 2$$

になります。Ta(2)を求めなさい(2つの自然数の立方数の和で2通りの方法で表せる整数で最小の整数)。

挑戦してみよう2¶

マクドナルドのチキンマックナゲットは、発売当初6個入り、9個入り、20個入りが提供されていました。この個数の足し算で表せる値をチキンマックナゲット数と呼びます。6, 12, 15, 18, 20, 21はチキンマックナゲット数ですが、1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22は非チキンマックナゲット数です。十分に大きい整数は、互いに素(最大公約数が1)である整数の線型結合(足し算とか掛け算)で表せることが知られています。50までのチキンマックナゲット数を求め、最大の非チキンマックナゲット数を求めなさい。