アオイの備忘録ブログ

色んな事を書く備忘録用ブログです(※更新頻度は神のみぞ知る)

Rev : 2 FizzBuzz問題

ホントに無知で最近知りました、恥ずかしい限り、、、、、

C言語の基本的な問題と言う事で

 

FizzBuzz

https://ja.wikipedia.org/wiki/Fizz_Buzz

基本的には3で割り切れる整数は「Fizz」、5で割り切れる場合は「Buzz」、

両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」と言うゲームが元でそれをプログラムで表す事でプログラマの基礎能力を試すテストとしても使われるらしい。

 

メモ代わりにコード

#include <stdio.h>
int main(void) {
    int i;
    for (i = 1; i <= 100; i++) {
        if (i % 3 == 0 && i % 5 == 0) {
            printf("FizzBuzz\n");
        } else if (i % 3 == 0) {
            printf("Fizz\n");
        } else if (i % 5 == 0) {
            printf("Buzz\n");
        } else {
            printf("%d\n", i);
        }
    }
    return 0;
}

 

■もう一つの標準的な解答例として、文字列の連結を利用することで、3の倍数かつ5の倍数(すなわち15の倍数)か否かの判定を無くしたバージョン

ブランクと文字列を連結して文字型配列に代入することは、単に文字列を文字型配列に代入(複写)することと同義であるため、下記解答例の「strcpy(str, "Fizz")」は「strcat(str, "Fizz")」と書いても良い。

#include <stdio.h>
#include <string.h>
int main(void) {
    int i;
    char str[9];
    for (i = 1; i <= 100; i++) {
        strcpy(str, "");
        if (i % 3 == 0) {
            strcpy(str, "Fizz");
        }
        if (i % 5 == 0) {
            strcat(str, "Buzz");
        }
        if (strcmp(str, "") == 0) {
            sprintf(str, "%d", i);
        }
        printf("%s\n", str);
    }
    return 0;
}

 

■関数の再帰呼び出しによるプログラム

/*
fizzbuzz_rc.c
*/
#include <stdio.h>

void fizzbuzz(int n)
{
if (n > 1)
fizzbuzz(n-1);

if (n % 3 == 0 && n % 5 == 0) /* nが3の倍数かつ5の倍数 */
printf("Fizz,Buzz\n");
else if (n % 3 == 0)   /* nが3の倍数(かつ5の倍数でない) */
printf("Fizz\n");
else if (n % 5 == 0)   /* nが5の倍数(かつ3の倍数でない) */
printf("Buzz\n");
else   /* nが3の倍数でも5の倍数でもない */
printf("%d\n", n);
}

int main(void)
{
 fizzbuzz(100);

return 0;
}

C++プログラムによるFizzBuzz問題の解答例

/*
fizzbuzz.cpp
*/

#include <iostream>

using namespace std;

int main()
{
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0 && i % 5 == 0) // iが3の倍数かつ5の倍数
cout << "Fizz,Buzz" << endl;
else if (i % 3 == 0) // iが3の倍数(かつ、5の倍数でない)
cout << "Fizz" << endl;
else if (i % 5 == 0) // iが5の倍数(かつ、3の倍数でない)
     cout << "Buzz" << endl;
   else // iが3の倍数でも5の倍数でもない
     cout << i << endl;
  }
  return 0;
}

 ■関数の再帰呼び出しによるプログラム

/*
fizzbuzz_rc.cpp
*/

#include <iostream>

using namespace std;

void fizzbuzz(int n)
{
if (n > 1)
fizzbuzz(n-1);

if (n % 3 == 0 && n % 5 == 0) // nが3の倍数かつ5の倍数
cout << "Fizz,Buzz" << endl;
else if (n % 3 == 0) // nが3の倍数(かつ、5の倍数でない)
cout << "Fizz" << endl;
else if (n % 5 == 0) // nが5の倍数(かつ、3の倍数でない)
cout << "Buzz" << endl;
else // nが3の倍数でも5の倍数でもない
cout << n << endl;
}

int main()
{
fizzbuzz(100);

return 0;
}

 

こういった基礎問題は余裕で解ける様にして

プログラムの考え方とかをアップさせていきたい。

 

補足的:

FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - give IT a try