如何在不使用%运算符的情况下在JavaScript中编写FizzBu​​zz

时间:2018-01-14 05:21:33

标签: javascript ecmascript-6 fizzbuzz

我知道如何在JavaScript中编写简单的FizzBu​​zz代码:



 x = 0;while (++x < 1000)console.log((x % 3 ? "" : "Fizz") + (x % 5 ? "" : "Buzz") || x);
&#13;
&#13;
&#13;

但是如何在不使用&#39;%&#39;的情况下获得相同的结果?操作

7 个答案:

答案 0 :(得分:5)

想一想%实际上是什么,它只是你用某个东西划分数字时的余数。您可以除以数字,然后将结果向下舍入,然后将其与除数相乘并从数字中减去。

const mod = (num,div)=> {
    const res =  (num / div) | 0; // coerce to int
    return num - (res * div);
}

console.log(mod(8,5));

答案 1 :(得分:1)

这是另一种方法,通过减去数字直到它得到负值,然后用分频器加上来得到余数。

done

答案 2 :(得分:1)

您使用Number.isInteger

const oneToOneHundred = Array.from({ length: 100 }, (_, i) => i + 1);

const fizzBuzz = (i) => {
  if (Number.isInteger(i / 15)) return 'FizzBuzz';
  if (Number.isInteger(i / 3)) return 'Fizz';
  if (Number.isInteger(i / 5)) return 'Buzz';
  return i;
};

console.log(oneToOneHundred.map((i) => fizzBuzz(i)).join('\n'));

答案 3 :(得分:0)

Modulus operator %只是两个数字的余数,您可以创建自己的函数,返回余数并将其替换为您的运算符。

x = 0;

while (++x < 1000) {
  console.log((modulo(x, 3) ? "" : "Fizz") + (modulo(x, 5) ? "" : "Buzz") || x);
}

function modulo(num1, num2) {
  if (num2 === 0 || isNaN(num1) || isNaN(num2)) {
    console.log("NaN");
    return NaN;
  } else if (num2 == 1) {
    //x mod 1 always = 0
    return 0;
  }

  num1 = Math.abs(num1);
  num2 = Math.abs(num2);

  return num1 - (num2 * Math.floor((num1 / num2)));
}

答案 4 :(得分:0)

我们可以检查数字是否可以除以3或5而无需模运算,甚至是除法运算符。

如果我们对所有数字求和,并且它是3,6或9,则该数字可以被3整除

如果我们检查一个数字的最后一位数字,并且它是0或5,那么它可以被5整除。

代码如下:

&#13;
&#13;
function isDivisibleByThree(i) {
  let sum = getDigits(i).reduce((sum, digit) => sum + digit);
  return sum > 9 ? isDivisibleByThree(sum) : (sum === 3 || sum === 6 || sum === 9);
}

function isDivisibleByFive(i) {
  let lastDigit = getDigits(i).pop();
  return lastDigit === 5 || lastDigit === 0
}

function getDigits(i) {
  return Array.from(i.toString()).map(Number);
}

for (let i = 1; i <= 100; i++) {
  let val = "";
  if (isDivisibleByThree(i))
    val += "fizz";
  if (isDivisibleByFive(i))
    val += "buzz";

  console.log(val ? val : i);
}
&#13;
&#13;
&#13;

答案 5 :(得分:0)

感谢大家的回答。我发现使用哈希表和使用递归以两种方式解决了它。我更喜欢递归。

&#13;
&#13;
function fuzzBuzz(fuzz_count,buzz_count,fuzz_buzz_count,counter) {
  if(fuzz_buzz_count === 15) {
    console.log("fuzzbuzz");
    fuzz_buzz_count = 0;
    buzz_count = 0;
    fuzz_count = 0;
  } else if(buzz_count === 5) {
    console.log("buzz");
    buzz_count = 0;
  } else if (fuzz_count === 3) {
    console.log("fuzz");
    fuzz_count = 0;
  } else  {
    console.log(counter);
  }
  
  if(counter < 100) {
    fuzzBuzz(++fuzz_count, ++buzz_count, ++fuzz_buzz_count, ++counter);
  }
  
}


fuzzBuzz(1,1,1,1);
&#13;
&#13;
&#13;

答案 6 :(得分:0)

这是一个简单的 fizzbuzz 解决方案,无需取模,也无需编写您自己的取模实现。它依赖于简单的计数器。

var i=0, n=0, f=1, b=1; 
while(i++<156)
  {
    n=i;
    
    if(f++==3)
    {
      document.write('Fizz');
      f=1; n='';
    }
    
    if(b++==5)
    {
      document.write('Buzz');
      b=1; n='';
    }
    
    document.write(n+'<br/>');
  }