在 Javascript 中获取没有模 (%) 运算符的余数,占 -/+ 符号
Getting a remainder without the modulo (%) operator in Javascript, accounting for -/+ sign
对于家庭作业,我需要在不使用内置模 (%) 运算符的情况下 return 将 num1 除以 num2 后的余数。我能够通过以下代码让大多数测试通过,但我仍然坚持如何解释给定数字的 -/+ 符号。我需要保留 num1 上的任何一个符号,如果 num2 是负数,我还需要 return 一个正数——这让我很困惑如何做到这一点……:)任何清晰度将不胜感激!我并不是在这里寻找直接的答案,更多的是我似乎遗漏了一些明显的东西......也许我需要一种新方法?
function modulo(num1, num2) {
if (num1 === 0) {
return 0;
}
if (num2 === 0 || isNaN(num1) || isNaN(num2)) {
return NaN;
}
if (num1 < num2) {
return num1;
}
if (num1 > 0 && num2 > 0) {
var counter = num1;
while (counter >= Math.abs(num2)) {
counter = counter - num2;
}
return counter;
}
}
var output = modulo(25, 4);
console.log(output); // 1
如果您考虑计算模数的数学过程,您可能会明白如何在不必求助于一堆 case 语句的情况下执行此操作。相反,你只是在计算余数:
给定 2 个数字 a 和 b,您可以通过执行以下操作计算 mod(a,b)
:
q = a / b; //finding quotient (integer part only)
p = q * b; //finding product
remainder = a - p; //finding modulus
用这个思路,应该可以迁移到JS。你说你不是在寻找直接的答案,所以我就这么说!
编辑: 这是代码,正如我在评论中所说的,它正是我在上面发布的伪代码:
function modulo(a,b){
q = parseInt(a / b); //finding quotient (integer part only)
p = q * b; //finding product
return a - p; //finding modulus
}
这将 return 与使用 %
完全相同的值
你可能想多了。您基本上在问题中陈述了解决方案:
I need to carry over whichever sign is on num1, and also return a positive number if the num2 is negative
第二部分不准确,但我怀疑你说错了。当 num2
为负数时应返回正数 除非 num1
为负数。
无论如何,重要的是,如果 num1
为负,则结果为负,否则结果为正。 num2
的符号被丢弃。
开始编写您编写的代码(其他人会很快指出这不是最简单的解决方案),解决方法是使用两个数字的绝对值计算余数,然后应用 num1
对结果的原始符号。
function modulo(num1, num2) {
var sign = num1 < 0 ? -1 : 1;
var dividend = Math.abs(num1);
var divisor = Math.abs(num2);
if (dividend === 0) {
return 0;
}
if (dividend === 0 || isNaN(dividend) || isNaN(divisor)) {
return NaN;
}
if (dividend < divisor) {
return sign * dividend;
}
var counter = dividend;
while (counter >= divisor) {
counter = counter - divisor;
}
return sign * counter;
}
console.log( 25 % 4, modulo( 25, 4));
console.log(-25 % 4, modulo(-25, 4));
console.log( 25 % -4, modulo( 25, -4));
console.log(-25 % -4, modulo(-25, -4));
.as-console-wrapper{min-height:100%;}
对于家庭作业,我需要在不使用内置模 (%) 运算符的情况下 return 将 num1 除以 num2 后的余数。我能够通过以下代码让大多数测试通过,但我仍然坚持如何解释给定数字的 -/+ 符号。我需要保留 num1 上的任何一个符号,如果 num2 是负数,我还需要 return 一个正数——这让我很困惑如何做到这一点……:)任何清晰度将不胜感激!我并不是在这里寻找直接的答案,更多的是我似乎遗漏了一些明显的东西......也许我需要一种新方法?
function modulo(num1, num2) {
if (num1 === 0) {
return 0;
}
if (num2 === 0 || isNaN(num1) || isNaN(num2)) {
return NaN;
}
if (num1 < num2) {
return num1;
}
if (num1 > 0 && num2 > 0) {
var counter = num1;
while (counter >= Math.abs(num2)) {
counter = counter - num2;
}
return counter;
}
}
var output = modulo(25, 4);
console.log(output); // 1
如果您考虑计算模数的数学过程,您可能会明白如何在不必求助于一堆 case 语句的情况下执行此操作。相反,你只是在计算余数:
给定 2 个数字 a 和 b,您可以通过执行以下操作计算 mod(a,b)
:
q = a / b; //finding quotient (integer part only)
p = q * b; //finding product
remainder = a - p; //finding modulus
用这个思路,应该可以迁移到JS。你说你不是在寻找直接的答案,所以我就这么说!
编辑: 这是代码,正如我在评论中所说的,它正是我在上面发布的伪代码:
function modulo(a,b){
q = parseInt(a / b); //finding quotient (integer part only)
p = q * b; //finding product
return a - p; //finding modulus
}
这将 return 与使用 %
完全相同的值你可能想多了。您基本上在问题中陈述了解决方案:
I need to carry over whichever sign is on num1, and also return a positive number if the num2 is negative
第二部分不准确,但我怀疑你说错了。当 num2
为负数时应返回正数 除非 num1
为负数。
无论如何,重要的是,如果 num1
为负,则结果为负,否则结果为正。 num2
的符号被丢弃。
开始编写您编写的代码(其他人会很快指出这不是最简单的解决方案),解决方法是使用两个数字的绝对值计算余数,然后应用 num1
对结果的原始符号。
function modulo(num1, num2) {
var sign = num1 < 0 ? -1 : 1;
var dividend = Math.abs(num1);
var divisor = Math.abs(num2);
if (dividend === 0) {
return 0;
}
if (dividend === 0 || isNaN(dividend) || isNaN(divisor)) {
return NaN;
}
if (dividend < divisor) {
return sign * dividend;
}
var counter = dividend;
while (counter >= divisor) {
counter = counter - divisor;
}
return sign * counter;
}
console.log( 25 % 4, modulo( 25, 4));
console.log(-25 % 4, modulo(-25, 4));
console.log( 25 % -4, modulo( 25, -4));
console.log(-25 % -4, modulo(-25, -4));
.as-console-wrapper{min-height:100%;}