#acl hogas:admin,read,write,delete,revert All:read #format gfm ## FizzBuzz問題の解答例 ### 実行例 まず、 FizzBuzz問題の実行例は以下になります 長いですが、確認して正しく動いているかチェックしてみてください 今回はプログラミングの演習なので、厳密にこの形でなくても、 例えばカンマ区切りで一行、などで出力していても良いとします (なので出力方法を変えたらもっと小さなコードになったなどもokです) ``` 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz ``` ### プログラム 解答は何種類も存在します 自分なりに書いて、実行例と同じように出力できれば、それも正しい解答です FizzBuzz問題は、 - 同じ処理を複数回書かないこと - 処理全体を短く / 速くすること などのポイントがあります、が、気負わずに動くものを作ってみましょう #### 解答 (1) ```javascript let i for (i = 1; i <= 100; i = i + 1) { if (i % 15 === 0) { // i % 3 === 0 && i % 5 === 0 でも同じ // 15 (3 と 5) で割り切れるとき console.log('FizzBuzz') } else if (i % 3 === 0) { // 3 だけで割り切れるとき console.log('Fizz') } else if (i % 5 === 0) { // 5 だけで割り切れるとき console.log('Buzz') } else { // 3 でも 5 でも割り切れないとき console.log(i) } } ``` #### 解答 (2) ```javascript let i for (i = 1; i <= 100; i = i + 1) { // 3 で割り切れるとき if (i % 3 === 0) { if (i % 5 === 0) { // ついでに 5 でも割り切れるとき console.log('FizzBuzz') } else { // 5 では割り切れないとき、つまり 3 のみで割り切れるとき console.log('Fizz') } } else if (i % 5 === 0) { // 3 では割り切れないが 5 で割り切れるとき console.log('Buzz') } else { // 3 でも 5 でも割り切れないとき console.log(i) } } ``` #### 解答 (3) ```javascript let i for (i = 1; i <= 100; i = i + 1) { // 3 か 5 どちらかで割りきれるとき if (i % 3 === 0 || i % 5 === 0) { // の中で 5 では割り切れない、つまり 3 で割り切れるとき if (i % 5 !== 0) { console.log('Fizz') } else if (i % 3 !== 0) { // の中で 3 では割り切れない、つまり 5 で割り切れるとき console.log('Buzz') } else { // どちらでも割り切れるとき console.log('FizzBuzz') } } else { // 3 でも 5 でも割り切れないとき console.log(i) } } ``` #### 解答 (4) 講習内では扱わなかった、文字列の **結合** というのを使ってみます ```javascript let i, str for (i = 1; i <= 100; i = i + 1) { // 表示用の文字列を空っぽに戻す str = '' if (i % 3 === 0) { // 3 で割り切れるので少なくとも 'Fizz' は表示する str = str + 'Fizz' } if (i % 5 === 0) { // 5 で割り切れるので少なくとも 'Buzz' は表示する str = str + 'Buzz' } // どちらかで割り切れていたら何か文字列が入っているはず // それが入っていないなら 3 でも 5 でも割り切れない if (str === '') { // 一応 str は文字列、 i は数なので、 // i を文字列に変換して str に格納してみました str = i.toString() } console.log(str) } ``` #### 解答 (5) `%` 演算子を使わないでやってみます ```javascript let i let num3, num5 for (i = 1; i <= 100; i = i + 1) { // 3 で割り切れるかどうか num3 = i // 0 か 負の数になるまで 3 を引き続ける while (num3 <= 0) { num3 = num3 - 3 } // 5 で割り切れるかどうか num5 = i // 0 か 負の数になるまで 3 を引き続ける while (num5 <= 0) { num5 = num5 - 5 } if (num3 === 0 && num5 === 0) { // num3 + num5 === 0 でも同じ // 3 で割り切れていれば num3 は0 、 // 割り切れていなければ num3 は負の数 console.log('FizzBuzz') } else if (num3 === 0) { // 3 で割り切れていれば num3 は0 、 // 割り切れていなければ num3 は負の数 console.log('Fizz') } else if (num5 === 0) { // 5 で割り切れていれば num5 は0 、 // 割り切れていなければ num5 は負の数 console.log('Buzz') } else { // 3 でも 5 でも割り切れていなければ数を表示 console.log(i) } } ```