見出し画像

Lesson3(GoogleColabではじめるPython)‐実践編‐

Lesson3(GoogleColabではじめるPython)-演算子と制御構造-
のクイズです。

このパートでは日常生活をイメージしたものを全部で3問作成しました。より楽しめるような内容となっています。

今回は少しレベルが高いのですが、できそうな問題だけでもチャレンジしてみてください!


問題

Q1: FizzBuzz問題

有名な問題です。
以下の条件を満たす1から100までの数、文字を表示させてください。

  • 3で割り切れる数の場合は、数の代わりに「Fizz」と出力する。

  • 5で割り切れる数の場合は、数の代わりに「Buzz」と出力する。

  • 3と5の両方で割り切れる数の場合は、「FizzBuzz」と出力する。

実行例:


Q2: 素数を探そう

1から100までの数字の中で素数を見つけて出力するプログラムを作成してください。※素数は1とその数自身以外では割り切れない数です。

この問題は2重ループ(ループの中にループを入れる)を使用します。慣れていない方は解答・解説を見てから理解する方法でもOKです!

実行例:


Q3: 貨幣・紙幣計算ツール

入力した金額(整数)に対して使用する紙幣、貨幣の種類とその個数(枚数)を表示するプログラムを作成してください。

なお、使用する紙幣、硬貨は
10000円札、5000円札、1000円札、500円玉、100円玉、50円玉、10円玉、5円玉、1円玉
です。

実行例:
12345を入力したときの例です。



ワンポイントアドバイス -キーボードで入力を受け付けるための方法-

入力にはinput関数を使用します。ただし、文字列として代入されます。
例えば、
name = input("名前を入力してください")
実行すると、以下のように動作します。

実行後にキーボードで入力するためのフォームが表示されます。
例えば、以下のようにprint(name)を追加して代入された変数の値を表示する命令を追加します。
Taroと入力すると以下のように実行されます。

受け取る値はすべて文字列となるため、
例えば、3という数を入力しても文字列として受け取ります。

数値として扱いたい場合はint()を使用することで文字列から数値(整数)に変換することができます。

type関数を用いると数値が代入されていることがわかります。


解答

Q1 解答:

for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

解説:


%記号は剰余(あまり)を表します。
例えば
i%3は変数iに代入されている値を3で割ったあまり
という意味になります。
上記のコードは1から100までの数字を順番に処理しています。各数字に対して、以下の条件をチェックします:

  1. 数字が3と5の両方で割り切れる場合(3の倍数かつ5の倍数)、"FizzBuzz"を出力します。

  2. 数字が3で割り切れる場合(3の倍数)、"Fizz"を出力します。

  3. 数字が5で割り切れる場合(5の倍数)、"Buzz"を出力します。

  4. 上記のどの条件にも当てはまらない場合、数字自体を出力します。

この演習では、プログラムが複数の条件をどのように評価し、それに応じて異なるアクションを取るかを学ぶことができます。また、FizzBuzz問題はコーディング面接の一環としてよく用いられるため、プログラミングの基本を固めるのに非常に役立ちます。

Q2 解答:

for num in range(1, 101):
    if num > 1:
        for i in range(2, num):
            if (num % i) == 0:
                break
        else:
            print(num)

解説:
1から100までの各数に対して次の手順を実行します:

  1. 数が1より大きいかをチェックします。素数の定義により、1は素数ではありません。

  2. 次に、2からその数自身の一つ前までの数(i)で割り算を試みます。これは、その数が他の数で割り切れるかどうかを確認するためです。

  3. もし割り切れる(num % i == 0)場合は、その時点でループを中断(break)し、次の数に進みます。これは、その数が素数ではないことを意味します。

  4. elseブロックは、内側のforループが途中でbreakされずに完了した場合にのみ実行されます。これは、その数が素数であることを意味し、その数が素数であることを出力します。

Q3 解答:

amount = int(input("金額を入力してください: "))

bill_10000 = amount // 10000
amount = amount % 10000

bill_5000 = amount // 5000
amount = amount % 5000

bill_1000 = amount // 1000
amount = amount % 1000

coin_500 = amount // 500
amount = amount % 500

coin_100 = amount // 100
amount = amount % 100

coin_50 = amount // 50
amount = amount % 50

coin_10 = amount // 10
amount = amount % 10

coin_5 = amount // 5
amount = amount % 5

coin_1 = amount

print("10000円札:", bill_10000, "枚")
print("5000円札:", bill_5000, "枚")
print("1000円札:", bill_1000, "枚")
print("500円玉:", coin_500, "枚")
print("100円玉:", coin_100, "枚")
print("50円玉:", coin_50, "枚")
print("10円玉:", coin_10, "枚")
print("5円玉:", coin_5, "枚")
print("1円玉:", coin_1, "枚")

解説:

コードの行数が多く感じますが、以下の2行が理解できればOKです。
bill_10000 = amount // 10000
amount = amount % 10000

①bill_10000 = amount // 10000
 金額amountに代入された値を10,000で割ったときの商(整数部分)を 
 bill_10000に代入しています。
 例えば12345円の場合は
 12345÷10000の商1.2345の整数部分は1、つまり1万円札は1枚ということが計算
 でわかります。

②amount = amount % 10000
 amountに代入された値を10000で割った余りを代入し、amountの値を更新して
 います。
 ①の処理によって10000円札1枚必要ということがわかりました。続いて5000円
 札の枚数の処理にうつるわけですが、
 残りの金額で計算をする際に
 変数amountを12345÷10000の余りである2345に代入し更新しています。

③以降も同様に紙幣・貨幣の種類によって商と余りを計算することにより紙幣・
 貨幣の枚数を計算しています。


いかがでしたか?今回は少しレベルが高いと感じたかもしれませんが、1つ1つ動かしながら理解することも近道です。
またChatGPTにわからないことを投げてみましょう!きっと解決できます。

クイズは以上です。ぜひLesson4にもトライしてみてください!

マガジンにてまとめています↓

この記事が気に入ったらサポートをしてみませんか?