【Pythonで入試問題解いてみた!】点数を自分で決められる伝説の問題

Python
画像引用:https://examist.jp/legendexam/1995-kyoto/

※(1)は省略します…

最終的な回答

def f(n):
    return n % 7

def g(n):
    sigma = 0
    for k in range(1,8):
        sigma += k**n
    return 3 * f(sigma)

n = 0
score = 0
while score <= 0:
    n += 1
    score = g(n)

print("私の好きな自然数はn={}です。g({})={}点ください。".format(n,n,score))

コード作成の手順

関数の定義

問題文冒頭をよく読んで、関数f(n)とg(n)を定義します。

f(n) を定義する

まずはf(n)です。

「nを7で割った余り」なので,演算子「%」が使えます。

例えば

23 % 5
#出力:3

は「23を5で割った余り」を表しています。

というわけで,f(n)の定義は下のように書けます。

def f(n):
    return n % 7

g(n) を定義する

今度は g(n) を定義していきます。

まず ∑ の計算をしていきます。

今回の ∑ は
1n+2n+……+7n
の計算を表しています。

というわけで,この
1n+2n+……+7n
を変数 sigma に代入しようと思います。

ひとまず sigma = 0 としておき,for文のループ処理で
kn にk=1,2,……,7 を代入して変数 sigma に順次加えていきます。

def g(n):
    sigma = 0
    for k in range(1,8):
        sigma += k**n
    return 3 * f(sigma)

そして最後に, f(n) へ sigma を代入したものを3倍して終わりです。

点数が0点より大きくなるnを探す

nを1からどんどん大きくしていって、”1点”でも点数がもらえるような自然数nを探していきます。

変数 n と score を用意しておいて,初期値はどちらも 0 にしておきます。

score の値が0以下となっている間はずーっとnを1ずつ増やしながら g(n) を調べていきたいので,while文で処理します。

n = 0
score = 0
while score <= 0:
    n += 1
    score = g(n)

答えを書く!

そして,score の値が正になったら答えを出力していきます。

print("私の好きな自然数はn={}です。g({})={}点ください。".format(n,n,score))

#もしくは…
print("私の好きな自然数はn={0}です。g({0})={1}点ください。".format(n,score))
print("私の好きな自然数はn=" + str(n) + "です。g(" + str(n) + ")=" + str(score) + "点ください。")

ということで答えは

私の好きな自然数はn=6です。g(6)=18点ください。

となりました…!

おまけ:nがどんな数のときに点数がもらえるか?

今回出た結果ではn=6となりましたが,必ずしも6である必要はありません。

こちらのコードを使って,点数が正の数となるnを調べてみましょう。

score_ = 0
for i in range(1,101):
    score = g(i)
    if score > 0:
        print(i)

このコードを実行すると,
6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96
となりました。

ということは,nが6の倍数であれば,ちゃんと点数がもらえるわけですね。


※コードの誤りや,もっといい書き方があれば,お問い合わせまたはTwitterで報告してください。

記事への意見・感想はコチラ