C ++ Fizz Buzz替代版本

时间:2019-01-23 02:47:51

标签: c++ fizzbuzz

我是堆栈溢出的新手(是的,我对编码非常陌生),并且我目前正在研究Fizz Buzz问题的变更版本。有人可以帮我弄清楚我在做什么错吗?我似乎无法在Stack Overflow上找到答案。 使用while循环而不是for循环来编写程序,该程序输出从1到n的数字的字符串表示形式。

但是对于三的倍数,它应该输出“ Fizz”而不是数字,对于五的倍数,它应该输出“嗡嗡声”。对于三和五的倍数的数字,输出“ FizzBu​​zz”。

示例:

  

n = 15

     

输出:

     

1

     

2

     

嘶嘶声

     

4

     

嗡嗡声

     

嘶嘶声

     

7

     

8

     

嘶嘶声

     

嗡嗡声

     

11

     

嘶嘶声

     

13

     

14

     

FizzBu​​zz

我的代码是

   #include <iostream>
using namespace std;
int n = 0;
{
       cout << "Enter your number ";      // Prompt for input
       cin >> n;                          // Get the input.
       for (int i = 1; i <= n; i++) 
       {
               if ((i % 15) == 0)
                       cout << "FizzBuzz\n";
               else if ((i % 3) == 0)
                       cout << "Fizz\n";
               else if ((i % 5) == 0)
                       cout << "Buzz\n";
               else
                       cout << i << "\n";
       }
       return 0;
}

虽然我收到第4行的错误:

4:1: error: expected ',' or ';' before '{' token 

5 个答案:

答案 0 :(得分:2)

无论是for循环还是while循环,您都应该能够很好地做到这一点。但是,这不是您的程序失败的原因。如@EvilTeach先前所述,您的程序基本上是在main()函数中的大括号({})之外接受来自stdin(通过cin)的输入。

C / C ++中的函数签名定义为:-

return-type funcName(ArgType1 arg1, ... , ArgTypeN argN) 
{
    // cin goes here
    // Your loop goes here
}

答案 1 :(得分:1)

对于初学者,您需要将cin移动到大括号{}中。那应该可以解决编译错误。通常,在要求输入时也打印提示也是一个好主意。作为一般规则,如果您寻求帮助,请始终包括您得到的所有编译错误。这有助于解决这个问题。欢迎堆栈溢出。

#include <iostream>
using namespace std;
int main ()
{
       cout << "Enter your number ";      // Prompt for input
       cin >> n;                          // Get the input.
       for (int i = 1; i <= n; i++) 
       {
               if ((i % 15) == 0)
                       cout << "FizzBuzz\n";
               else if ((i % 3) == 0)
                       cout << "Fizz\n";
               else if ((i % 5) == 0)
                       cout << "Buzz\n";
               else
                       cout << i << "\n";
       }
       return 0;
}

答案 2 :(得分:1)

简单的解决方案

for(int i = 1; i <= n; i++)
{
    if(i % 15 == 0)
        cout << "FizzBuzz\n";
    else if(i % 3 == 0)  
        cout << "Fizz\n";
    else if(i % 5 == 0)
        cout << "Buzz\n";
    else
        cout << i << "\n";       
}

朴素解决方案的问题: % 15 等价于 % 3 && % 5。

因此,再次检查相同的条件是没有意义的。

有效的方法

for(int i = 1; i <= n; i++)
{
    string d ="";
    if(i % 3 == 0) d += "Fizz";
    if(i % 5 == 0) d += "Buzz";
    if(d == "") cout << i << "\n";
    else cout<< d << "\n"; 
}

上述有效解决方案的问题:“%”是一个代价高昂的运算符。

'%' 运算符的复杂度为 O(n ^ 2)

更有效的方法

int c3 = 0;
int c5 = 0;
for(int i = 1; i <= n; i++)
{
    c3++;
    c5++;
    string d = "";
     if(c3 == 3) 
     {
         d += "Fizz"; 
         c3 = 0;
     }
     if(c5 == 5)
     {
         d += "Buzz";
         c5 = 0;
     }   
     if(d == "") cout << i << "\n";
     else cout << d << "\n";
}

答案 3 :(得分:0)

在FizzBu​​zz中,代码效率很重要;较短的代码似乎更难以理解,但是较大的代码往往具有较低的学习曲线(可读性较低)。我选择了三种编码方式并测量其持续时间。众所周知,c ++相似的代码比用y编写的代码花费更多的时间和内存。因此,您应该根据二进制文件的最终目标以及执行的时间框架来窥视编码方式。

#include <iostream>
#include <chrono>
#include <cstring>

void runOne(int n, void (*fnc)(int));
void fizzbuzzAnsiC(int n);
void fizzbuzzAnsiC2(int n);
void fizzbuzzCpp(int n);

using namespace std;
using namespace std::chrono;

int main(int argc, char *argv[])
{ long iter = 100;

  if (argc > 1)
    iter = strtol(argv[1], nullptr, 10);

  runOne(int(iter), fizzbuzzAnsiC2);
  cout << endl << "==============" << endl;
  runOne(int(iter), fizzbuzzAnsiC);
  cout << endl << "==============" << endl;
  runOne(int(iter), fizzbuzzCpp);
  cout << endl << "==============" << endl;

  return 0;
}

void runOne(int n, void (*fnc)(int))
{ high_resolution_clock::time_point t1 = high_resolution_clock::now();
  fnc(n);
  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  auto duration = duration_cast<microseconds>( t2 - t1 ).count();
  cerr << "Lasted: " << duration << " us" << endl;
}

static const char* cszFizz = "Fizz";
static const char* cszBuzz = "Buzz";

void fizzbuzzAnsiC(int n)
{ int     i;
  char    szPrn[11];
  char    szNum[11]; //Suppose 9 digits number max (10e8-1)
  char    uMul;

  for (i = 1; i <= n; ++i)
  { uMul = i%15 == 0;
    strcpy(szPrn, uMul | (i%3==0) ? cszFizz : (i%5==0 ? cszBuzz : itoa(i, szNum, 10)));
    if (uMul) strcat(szPrn, cszBuzz);
    strcat(szPrn, "\n");
    fwrite(szPrn, 1, strlen(szPrn), stdout);
  }
}

void fizzbuzzAnsiC2(int n)
{ int i;
  const char *messages[] = {"%i\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"};

  for (i = 1; i <= n; ++i)
    printf(messages[((i % 3) == 0) + 2*((i % 5) == 0)], i); //printf takes longer then str* functions
}

void fizzbuzzCpp(int n)
{ for (int i = 1; i <= n; ++i)
  { bool uMul = i%15 == 0;
    std::cout << (uMul | (i%3==0) ? cszFizz : (i%5==0 ? cszBuzz : std::to_string(i)));
    if (uMul) std::cout << cszBuzz;
    std::cout << std::endl;
  }
}

随着迭代次数的增加,fizzbuzzAnsiC2的效率降低。 fizzbuzzAnsiC函数始终是最高效的。

答案 4 :(得分:0)

最简单的版本。

#include <iostream>
#include <string>

using namespace std;
int main(){
    for(int i=1; i<=100; i++){
        string output = "";
        if(i%3 == 0) output += "fizz";
        if(i%5 == 0) output += "buzz";
        if(output == "") output = to_string(i);
        cout << output <<endl;
    }
}