【问题标题】:Print numbers from 1 to 100 and replace some with strings (fizzbuzz)打印从 1 到 100 的数字并用字符串替换一些数字 (fizzbuzz)
【发布时间】:2011-04-13 12:27:14
【问题描述】:

我正在从这里尝试 fizzbuzz 程序:Why Can't Programmers.. Program?

“编写一个程序,打印从 1 到 100 的数字。但是对于三的倍数打印“Fizz”而不是数字,对于五的倍数打印“Buzz”。对于同时是三和五的倍数的数字打印“FizzBu​​zz”。”

protected void btn1_Click(object sender, EventArgs e)
    {
        for (int i = 1; i < 101; i++)
        {
            if (i % 3 == 0 & i % 5 == 0)
            {
                Response.Write("fizzbuzz" + ",");
            }
            else if (i % 3 == 0)
            {
                Response.Write("fizz" + ",");
            }
            else if (i % 5 == 0)
            {
                Response.Write("buzz" + ",");
            }
            else
            {
                i = i + 0;
            }

            Response.Write(i +",");
        }

    }

我能够产生某种结果,例如:

1,2,fizz,3,4,buzz,5,fizz,6,7,8,fizz,9,buzz,10,11,fizz,12,13,14,fizzbuzz,15,16,17 ,fizz,18,19,buzz,20,fizz,21,22,23,fizz,24,buzz,25,26,fizz,27,28,29,fizzbuzz,30,31,32,fizz,33,34 ,buzz,35,fizz,36,37,38,fizz,39 等等..

fizz这个词被打印了,但它没有代替3,fizzbuzz被打印了,但它没有代替15等等......

【问题讨论】:

  • 只是一点点改进:删除第一个条件 if (i % 3 == 0 &amp; i % 5 == 0) 并仅在循环末尾附加逗号。
  • 顺便说一句,i = i + 0; 是干什么用的?! o_O
  • @zerkms - 不需要
  • 等一下,我看到它漂浮在此页面的左侧? CSS 问题?
  • @zerkms :有没有比我做的更简单的方法?

标签: c# fizzbuzz


【解决方案1】:

无论您是否满足 if 条件,您仍在代码末尾打印 i

具体查看你的 for 循环:

for (int i = 1; i < 101; i++)         
{             
if (i % 3 == 0 & i % 5 == 0)             
{                 
Response.Write("fizzbuzz" + ",");             
}             
else if (i % 3 == 0)             
{                 
Response.Write("fizz" + ",");             
}             
else if (i % 5 == 0)             
{                 
Response.Write("buzz" + ",");             
}             
else             
{                 
i = i + 0;             
}              
Response.Write(i +",");   //look here you print i
} 

所以你需要移动最后一个 Response.Write(i + ",");在最后一个else 条件下。查找此类错误的最简单方法是使用调试器并调试您的程序。然后,您将很容易看到输出是什么。所以一定要使用调试器并设置断点/监视并观察会发生什么。您的代码应更改为:

  for (int i = 1; i < 101; i++)         
    {             
    if (i % 3 == 0 & i % 5 == 0)             
    {                 
    Response.Write("fizzbuzz" + ",");             
    }             
    else if (i % 3 == 0)             
    {                 
    Response.Write("fizz" + ",");             
    }             
    else if (i % 5 == 0)             
    {                 
    Response.Write("buzz" + ",");             
    }             
    else             
    {                 
    Response.Write(i +",");   //look here you print i
    }              
    } 

请注意,删除 i=i+1 您的 for 循环已经通过增加 i 来处理这个问题。

编辑

不确定这是否更容易,但这是使用 lambda 的另一种方法:
            List<int> t;
            t = Enumerable.Range(1, 100).ToList();

            var fizzBuzz = t.Where(num => num % 3 == 0 && num % 5 == 0);
            var fizz = t.Where(num => num % 3 == 0);
            var buzz = t.Where(num => num % 5 == 0);
            var notFizzBuzz = t.Where(num => num % 3 != 0 && num % 5 !=0);

            //print fizzBuzz elements
            Console.WriteLine("Printing fizzBuzz elements...");
            foreach (int i in fizzBuzz)
                Console.WriteLine(i);

            //print fizz elements
            Console.WriteLine("Printing fizz elements...");
            foreach (int i in fizz)
                Console.WriteLine(i);

            //print buzz elements
            Console.WriteLine("Printing buzz elements...");
            foreach (int i in buzz)
                Console.WriteLine(i);

            //print other elements
            Console.WriteLine("Printing all others...");
            foreach (int i in notFizzBuzz)
                Console.WriteLine(i);

【讨论】:

  • 所以我的代码几乎是正确的,我只需要删除一行并将正确的内容移到 else 循环中:)。
  • @nandu.com 在编辑中我打印数字而不是 fizz/buzz/fizzbuzz,但您可以修改它以满足您的需要。
【解决方案2】:

试试这些改变

protected void btn1_Click(object sender, EventArgs e)
{
    for (int i = 1; i < 101; i++)
    {
        if (i % 3 == 0 & i % 5 == 0)
        {
            Response.Write("fizzbuzz" + ",");
        }
        else if (i % 3 == 0)
        {
            Response.Write("fizz" + ",");
        }
        else if (i % 5 == 0)
        {
            Response.Write("buzz" + ",");
        }
        else
        {
            Response.Write(i +",");
        }           
    }
}

您的i = i + 0 显然什么都不做,因为您将 i 的值加 0。

无论 if/else 块的结果如何,您都将数字打印到响应中(它放在它之后),所以它应该被移到 else 中(意味着仅在 if 或 else if 不匹配时打印.

【讨论】:

    【解决方案3】:

    Response.Write(i +","); 移动到你的最终 else

    【讨论】:

      【解决方案4】:
      protected void btn1_Click(object sender, EventArgs e)
      {
          for (int i = 1; i < 101; i++)
          {
              if (i % 3 == 0 & i % 5 == 0)
              {
                  Response.Write("fizzbuzz" + ",");
              }
              else if (i % 3 == 0)
              {
                  Response.Write("fizz" + ",");
              }
              else if (i % 5 == 0)
              {
                  Response.Write("buzz" + ",");
              }
              else
              {
                  i = i + 0; //this is totally useless
                  Response.Write(i + ",");
      
              }
      
              //Response.Write(i +","); //This will always write the number, even if you wrote fizz or buzz
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        它的另一个简单实现:

        for (int i = 1; i <= 100; i++)
                {
                    Console.WriteLine((i % 3 == 0) ? ((i % 5 == 0) ? "FizzBuzz" : "Fizz") : ((i % 5 == 0) ? "Buzz" : i.ToString()));
                }
        Console.ReadKey();
        

        【讨论】:

          【解决方案6】:
              public static void PrintMod3And5FromInterval(int start, int end)
              {
                  if (end < start)
                  {
                      Console.WriteLine("End number should be higher than start.");
                  }
                  else
                  { 
                      string result = "";
                      for (int x = start; x <= end; x++)
                      {
                          if (x % 3 == 0)
                              result += "fizz";
                          if (x % 5 == 0)
                              result += "buzz";
                          if (result == "")
                              Console.WriteLine(x);
                          else
                              Console.WriteLine(result);
                          result = "";
                      }
                  }
              }
              static void Main(string[] args)
              {
                  PrintMod3And5FromInterval(1, 100);
                  Console.Read();
              }
          

          【讨论】:

            【解决方案7】:

            这是我原来的解决方案...

            for (let number = 1; number <= 100; number ++) {
            if (number % 3 === 0 && number % 5 === 0) {
                console.log(number + "fizzbuzz");
            } else if (number % 5 === 0) {
            console.log(number + "buzz");
            } else if (number % 3 === 0)
            console.log(number + "fizz");
            else  {
            console.log(number);
            }
            }     
            

            但是这个要短得多……

            for (let n = 1; n <= 100; n++) {
              let output = "";
                if (n % 3 == 0) output += "Fizz";
                if (n % 5 == 0) output += "Buzz";
              console.log(output || n);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-23
              • 1970-01-01
              • 2018-10-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多