如何在不使用 % 运算符的情况下在 JavaScript 中编写 FizzBuzz
How to write FizzBuzz in JavaScript without using % operator
我知道如何在 JavaScript 中编写简单的 FizzBuzz 代码:
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/>');
}
我知道如何在 JavaScript 中编写简单的 FizzBuzz 代码:
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/>');
}