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

How to write FizzBuzz in JavaScript without using % operator

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

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

但是如果不使用 '%' 运算符,我们怎么能得到相同的结果呢?

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

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

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

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

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

另一种方法是将数字减去直到得到负值,然后用除数相加得到余数。

function mod(number, divider){
 var num = number;
 while(num>=0){
  num = num - divider;
 }
 num = num + divider;
 return num;
}

console.log(mod(92, 3) == 92%3);

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

如果我们将所有数字相加,结果是 3、6 或 9,那么这个数字可以被 3 整除

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

代码如下所示:

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

感谢大家的回答。我发现用两种方法解决了它,一种是使用散列table,另一种是使用递归。我更喜欢递归。

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);

您使用 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'));

这是一个简单的 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/>');
  }