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 这样的传统语言中,您可能不会得到它更短的时间(我假设您不想要使您的代码不可读的正常代码高尔夫风格的修改)。

如果您将整个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 字符串可能只有一个

正如我所说,应该测试它是否更快。此外,您的原始规范仅要求最短的代码,因此可能无关紧要。

于 2012-02-27T07:38:31.093 回答
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 回答
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

这避免了一些代码重复,但需要一个临时变量char t

void FizzBuzz( ) {
    char t = 0;
    for (unsigned char i = 1; i <= 100; ++i, t = 2) {
        (i % 3) ? --t : printf("Fizz");
        (i % 5) ? --t : printf("Buzz");
        if (!t) printf("%d", i);
        printf("\n");   
    }
}
于 2016-07-22T21:30:11.930 回答
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 回答
1

我会使用辅助功能:-)

#include <stdio.h>

int fbindex(int n) {
    int i = 0;
    if (n % 3 == 0) i += 1;
    if (n % 5 == 0) i += 2;
    return i;
}

int main(void) {                                 
    const char *fb[] = {"%d\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"};
    for (int i = 1; i <= 100; i++) printf(fb[fbindex(i)], i);                
}
于 2017-05-18T12:00:43.120 回答
1

您可以使用字符串来做到这一点:

String s="";
if(num%3==0)
   s+="fizz";
if(num%5==0)
   s+="buzz";
if(s.length()==0)
   s+=num+"";
于 2017-03-08T14:12:44.267 回答
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 回答
-2

李斯特先生回答的混淆形式

main(int i){while(i++<100){printf("number= %d %s%s",i,i%3?"":"Fizz",i%5?"":"Buzz");}}

于 2013-06-26T21:27:02.060 回答