どちらのプログラムが良いのでしょうか?(C言語)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Jimmy

どちらのプログラムが良いのでしょうか?(C言語)

#1

投稿記事 by Jimmy » 13年前

FizzBuzz

ルールは、
  • 1から順番に数を表示する
  • その数が3で割り切れるなら"Fizz"、5で割り切れるなら"Buzz"、両方で割り切れるなら"FizzBuzz"と表示する
実行例
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
http://vipprog.net/wiki/exercise.html より)

私は↓のように組んでみました。

コード:

#include <stdio.h>

int main(void) {
	int i;
	for(i = 1; i <= 100; i++) {
		if(!(i%3)) printf("Fizz");
		if(!(i%5)) printf("Bizz");
		if(i%3 && i%5) printf("%d",i);
		printf("\n");
	}
	return 0;
}
解答例は↓のようでした。

コード:

#include <stdio.h>

int main(void){
  int i;
  
  for(i = 1; i <= 100; i++){
    if(i % 15 == 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;
}
http://vipprog.net/wiki/%E7%B7%B4%E7%BF ... uzz/C.html より)

私のプログラムでは「FizzBizz」の時はprintf()関数が3回実行されてしまいます。
一方、解答例はどんなときもprintf()関数の実行は1回ですみます。ですが、私のソースより長く、条件分岐は多いです。

将来的にもっと複雑な処理を組むときには、私のやり方だと処理が低速になってしまうのでしょうか?
一概には言えないと思いますが、「プログラミング」ではどのような事が求められるでしょうか?
また、この問題でもっと良いアルゴリズムがあれば教えてください!

Jimmy

Re: どちらのプログラムが良いのでしょうか?(C言語)

#2

投稿記事 by Jimmy » 13年前

質問者です。

Bizz
Buzz

間違えました。すみません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: どちらのプログラムが良いのでしょうか?(C言語)

#3

投稿記事 by softya(ソフト屋) » 13年前

今の時代は読みやすく修正しやすいプログラムが効率化のために良いとされています。
それとコンパイラが最適化するので拘っても意味が無いって場合もあります。
あと実行するコンパイラやCPUで癖も違います。
なので、パソコンで組む時は速度ネックにでもならない限り細かい所に拘っても大方意味が無いと断っておきますが、現実問題として細かいところよりもアルゴリズムとかを工夫しないと速度の出ない場合のほうが遥かに多いです。

【解説】
今回の処理をパソコンに限定すれば、速度ネックは機械語レベルの分岐(jump命令)とprintfです。
解答例は、1回のprintfが確定で、FizzBuzzの場合1分岐、Fizzの場合2分岐、Buzzの場合3分岐、その他の場合は4分岐します。※分岐はループの戻りを含んでいます。
Jimmyさんのプログラムは、必ず2回のprintfが実行され、FizzBuzzの場合2分岐、Fizzの場合3分岐、Buzzの場合3分岐、その他の場合は3分岐します。
どっちが分岐が多いかは計算してみてください。

ちなみに一番速度が早いのは、分岐が無くてprintfではなくputsなのが一番。なのでマクロで1から100まで展開してしまうのが一番早いです。

【補足】
書き忘れてましたが、読みやすく分かりやすく直しやすい事を前提とするなら解答例が良いと思います。
Jimmyさんのは技巧的で直感的に理解しづらいからです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Jimmy

Re: どちらのプログラムが良いのでしょうか?(C言語)

#4

投稿記事 by Jimmy » 13年前

ご丁寧にありがとうございます。やはり解答例のほうがよさそう感じがします。ありがとうございました。

かずま

Re: どちらのプログラムが良いのでしょうか?(C言語)

#5

投稿記事 by かずま » 13年前

softya(ソフト屋) さんが書きました: あと実行するコンパイラやCPUで癖も違います。
CPU が、整数除算命令のない ARM なら、こんなのはどうでしょうか?

コード:

#include <stdio.h>

#define N 100

char *t[15] = {
    NULL, NULL, "Fizz", NULL, "BuZZ", "Fizz", NULL, NULL,
    "Fizz", "Buzz", NULL, "Fizz", NULL, NULL, "FizzBuzz"
};

int main(void)
{
    int i, j = 0;
    for (i = 1; i <= N; i++) {
        t[j] ? puts(t[j]) : printf("%d\n", i);
        if (++j == 15) j = 0;
    }
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る