8

クイズがあり、次のコードを書きました。

3 で割り切れる場合は Fizz を出力し、5 で割り切れる場合は Buzz を出力します。両方で割り切れる場合は FizzBu​​ss を出力します。それ以外の場合は、1 から 100 までの数字が出力されます。

しかし、家に帰ってから、もっと少ないコードで書くことができたのではないかと考えました。しかし、より短いコードは思いつきませんでした。短いコードでそれを行うことはできますか? ありがとう。

これは私が書いたもので、うまく機能していると思います。しかし、より少ないコードでそれを行うことができたでしょうか。

#include <stdio.h>

int main(void)
{
    int i;
    for(i=1; i<=100; i++)
    {
        if(((i%3)||(i%5))== 0)
            printf("number= %d FizzBuzz\n", i);
        else if((i%3)==0)
            printf("number= %d Fizz\n", i);
        else if((i%5)==0)
            printf("number= %d Buzz\n", i);
        else
            printf("number= %d\n",i);

    }

    return 0;
}
4

11 に答える 11

17

次のこともできます。

#include <stdio.h>

int main(void)
{
    int i;
    for(i=1; i<=100; ++i)
    {
        if (i % 3 == 0)
            printf("Fizz");
        if (i % 5 == 0)
            printf("Buzz");
        if ((i % 3 != 0) && (i % 5 != 0))
            printf("number=%d", i);
        printf("\n");
    }

    return 0;
}

数行短くなり、読みやすくなりました。

于 2012-02-27T07:46:08.473 に答える
11

いつ読めないように呼び始めるかはわかりませんが、これはあります。

#include <stdio.h>

int main(void)
{
   int i = 1;
   for (; i<=100; ++i) {
      printf("number= %d %s%s\n", i, i%3?"":"Fizz", i%5?"":"Buzz");
   }
   return 0;
}
于 2012-02-27T08:08:23.697 に答える
8

ある数値が 3 と 5 の両方で割り切れる場合、その数値は 15 で割り切れるので、次のようになります。

for each number 1 to 100:
    if number % 15 == 0:
        print number, "fizzbuzz"
    else if number % 5 == 0:
        print number, "buzz"
    else if number % 3 == 0:
        print number, "fizz"
    else:
        print number

それ以外は、少なくとも C のような従来の言語では、おそらくそれほど短くはなりません (そして、コードを読めなくする通常のコード ゴルフ スタイルの変更は望まないと思います)。

関数全体を 1 つの大きな行に詰め込むと、全体を 2 行にまとめることもできますがmain、そのような策略の後ではないことを願っています。

次のようなものを使用すると、おそらくより速く取得できます(ただし、すべてのパフォーマンスの主張を自分で確認する必要があります)。

static const char *xyzzy[] = {
    "",     "",     "fizz", "",     "buzz",
    "fizz", "",     "",     "fizz", "buzz",
    "",     "fizz", "",     "buzz", "fizzbuzz",
    // Duplicate those last three lines to have seven copies (7x15=105).
};
for (int i = 1; i <= 100; i++)
    printf ("%d %s\n", i, xyzzy[i-1]);

余談ですが、その char ポインターの配列は、定数の融合のおかげで、思ったよりもスペースがかからない可能性があります。つまり、各 C 文字列は1 つしか存在しない可能性があります。

私が言うように、それが速いかどうかはテストする必要があります。さらに、元の仕様では最短のコードしか求められていなかったため、無関係である可能性があります。

于 2012-02-27T07:38:31.093 に答える
2
#include <stdio.h>

char const * template[] = {
  "%i",
  "Buzz",
  "Fizz",
  "FizzBuzz"
};
const int __donotuseme3[] = { 2, 0, 0 };
const int __donotuseme5[] = { 1, 0, 0, 0, 0 };
#define TEMPLATE(x) (template[__donotuseme3[(x) % 3] | __donotuseme5[(x) % 5]])

int
main(void) {
  int i;
  for (i = 1; i <= 100; i++) {
    printf(TEMPLATE(i), i);
    putchar('\n');
  }
  return 0;
}
于 2015-06-08T18:52:25.910 に答える
2

モジュロは高価ですが、比較は安価なので、モジュロは一度だけ実行してください。それはこのようなものをもたらすでしょう。

int i;
for( i = 0; i!=100; ++i ) {
    bool bModThree = !(i % 3);
    bool bModFive = !(i % 5);

    if( bModThree || bModFive ) {
        if( bModThree ) {
            printf( "Fizz" );
        }
        if( bModFive ) {
            printf( "Buzz" );
        }
    } else {
        printf( "%d", i );
    }

    printf( "\n" );
}
于 2012-02-27T08:03:15.273 に答える
1

私はそのようなものを書くだろう

    main(){
  if (i % 3 == 0){
  cout<<"Fizz";
  }
  if (i % 5 == 0){
  cout<<"Buzz";
  }
  // So if both are true, it will print “FizzBuzz” and augment the two strings
    }
于 2014-12-12T17:26:13.133 に答える
0
void main()
{
    int i = 0;
    char h[4];

    while (++i <= 100)
    {
        sprintf(h, "%d", i);
        printf("%s%s%s\n", i%3 ? "" : "fizz", i%5 ? "" : "buzz", (i%3 && i%5) ? h: "");
    }
}
于 2017-03-03T09:43:11.403 に答える