質問: 0: print("Buzz!") else: print(i) ``` Q7: その内整数nまでの”z”の個数を計算し表示せよ(ただしif文,for文の使用不可) 問題:Q6と同じ規則に従って、1から整数nまでを数字,Fizz,Buzz,FizzBuzz,に分けていき、その内いくつ"z"があるか個数をカウントし表示させなさい。 条件:if文,for文は使用してはいけない。 ``` #Q7答え def count_z(n): print((n // 3 * 2) + n // 5 * 2) count_z(100) ```
回答: 文字列 `'Fizz'` には `z` が2つ入っていますよね? 同じく `'Buzz'` にも2つあるはずです。 そして `'FizzBuzz'` には4つあります。 `//` は割って小数を切り捨てる演算子です。 つまり `10 // 3` は `3` になります。これは 1 から 10 までの間に 3 の倍数が現れた回数に一致します。 ...ということは、 1 から 10 までの間に「`'Fizz'` の `z`」が現れた回数はその2倍になりますね? 同様に `10 // 5 * 2` は 1 から 10 までの間に「`'Buzz'` の `z`」が現れた回数です。 では 15 のときはどうでしょうか。 `'FizzBuzz'` に `z` は4つあります。15 は 3 の倍数でもあり 5 の倍数でもあります。 これを踏まえると、`15 // 3 * 2`(Fizz の z の数)と `15 // 5 * 2`(Buzz の z の数)をそのまま足せば 1 から 15 までの `z` の数が得られそうです。(3の倍数の場合と5の倍数の場合を両方満たすために、いちいち特殊化して考えなくてもいいから) これを 100 まで増やして考えてみるとご希望の式が得られると思います。