ログイン
編集不可のページディスカッション情報添付ファイル
hogas/ProgrammingSeminar2017/fizzbuzz

MMA

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)

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)

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)

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)

講習内では扱わなかった、文字列の 結合 というのを使ってみます

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)

% 演算子を使わないでやってみます

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)
  }
}

hogas/ProgrammingSeminar2017/fizzbuzz (最終更新日時 2017-06-13 20:38:47 更新者 hogas)