如何不用if去做fizzbuzz这一题
思路:使得这个数与3,5运算得到的结果a, b,通过不同的运算分别得到0,1,2,3这四个数,然后以这个结果为下标,去输出四种不同的结果。
对于下面的式子
a = c e i l ( ( f l o a t ) ( i % 3 ) / 5 ) a = ceil((float)(i\%3)/5) a=ceil((float)(i%3)/5)
取 i i i=4带入后运算得到 a = 1 a=1 a=1,取 i i i=21运算得到 a = 0 a=0 a=0,即结果输出为0代表 i i i是3的倍数,为1代表 i i i不是3的倍数。
对于下面的式子
b = c e i l ( ( f l o a t ) ( i % 5 ) / 5 ) b = ceil((float)(i\%5)/5) b=ceil((float)(i%5)/5) 是将上式里的 i % 3 i\%3 i%3改成 i % 5 i\%5 i%5,那么同样可以通过运算得出结论,
如果 i i i是5的倍数则得到 b = 0 b=0 b=0,否则得到 b = 1 b=1 b=1。
这样对于一个数 i , a + b i,a+b i,a+b得出的值有三种可能,0,1,2
0 代表 既能被3整除,又能被5整除
1 代表 能被3整除或者能被5整除
2 代表 都不能
到这一步我们大概的任务就完成了,下面就是区分为结果为1的两种情况了
这个容易,直接在上面两个的公式的任意一个前面加上一个系数就行了,如下
b = 2 ∗ c e i l ( ( f l o a t ) ( i % 5 ) / 5 ) b = 2*ceil((float)(i\%5)/5) b=2∗ceil((float)(i%5)/5)
这样的话,就有如下结论
0 代表 既能被3整除,又能被5整除 fizzbuzz
1 代表 只能被5整除 buzz
2 代表 只能被3整除 fizz
3 代表 都不能
代码如下
class Solution {
public:
/**
* @param n: An integer
* @return: A list of strings.
*/
vector<string> fizzBuzz(int n) {
vector<string> res_judge(4);
res_judge[0] = "fizz buzz";
res_judge[1] = "buzz";
res_judge[2] = "fizz";
res_judge[3] = "";
vector<string> res(n);
for(int j=0;j<n;j++){
int i = j+1;
res_judge[3] = to_string(i);
int dive3 = ceil((float)(i%3)/5)*1;
int dive5 = ceil((float)(i%5)/5)*2;
int count_div = dive3+dive5;
res[j] = res_judge[count_div];
}
return res;
}
};