关于FizzBuzz问题,我想大家都会想到用”整除”的方法,但是今天我看到一篇博客,用的是“计步”的方法,具体怎么计步呢? 先把问题简述一下,写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候,打印“Fizz”替代数字,5的倍数用“Buzz”代替,既是3的倍数又是5的倍数打印“FizzBuzz”。 简单的说,计步就是当没遇到3或5的倍数时,计步值从1开始,周期分别是1,2,3和1,2,3,4,5。当遇到3或5的倍数时,将计步数字置为1,继续计步,这样的话,当3的计步值和5的计步值分别为3和5时,则既是3的倍数又是5的倍数。 下面是我对代码的理解,如果你还不理解,可以自己从1开始,计算一下,理解的会更深刻,另外如果我的语言表达的不清楚,请批评指点。
package com.ustc.fizzbuzz; /** * * @author JBaymax *写一个程序打印1到100这些数字。 *但是遇到数字为3的倍数的时候,打印“Fizz”替代数字, *5的倍数用“Buzz”代替,既是3的倍数又是5的倍数打印“FizzBuzz”。 */ public class FizzBuzz { public static void main(String[] args) { int i; int step3 = 1,step5 = 1; // 步长计数 int FizzStat = 0, BuzzStat = 0, FizzBuzzStat = 0; for(i = 1; i <= 100; i++){ if((3 == step3 )&&(5 == step5)){ // 既是3的倍数又是5的倍数就打印“FizzBuzz” System.out.println("FizzBuzz = " + i); step3 = 1; step5 = 1; FizzStat++; BuzzStat++; FizzBuzzStat++; }else if(3 == step3){ //3的的倍数就打印“Fizz” System.out.println("Fizz = " + i); step3 = 1; // 当1,2 not Fizz Buzz后,3 == step3,这里的step3从3变成1,为什么要置1?step5是4 step5++; FizzStat++; // FizzStat表示遇到了几次3,可以理解为针对3的倍数出现的次数进行count++ }else if(5 == step5){ // 5的倍数就打印“Buzz” System.out.println("Buzz = " + i); step3++; // 当4 not Fizz Buzz后,5 == step5,step3是2 step5 = 1; // 现在知道为什么要置1了吧,就是每走3步,必然会是3的倍数, //每走5步必然会是5的倍数,当每次相等之后,需要重新计步 BuzzStat++; // BuzzStat表示遇到了几次5,可以理解为针对5的倍数出现的次数进行count++ }else{ System.out.println("not Fizz Buzz = " + i); step3++; // 走过3之后,走4,step3从1继续加,++后step3是2 step5++; // 走过3之后,走4,step5从4继续加,++后step5是5 } } System.out.println("Fizz = " + FizzStat + ",Buzz =" + BuzzStat +",FizzBuzz = " + FizzBuzzStat); } }