关于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);
}
}