Получение остатка без оператора по модулю (%) в Javascript с учетом знака -/+

Для домашнего задания мне нужно вернуть остаток после деления num1 на num2 БЕЗ использования встроенного оператора по модулю (%). Я могу выполнить большинство тестов с помощью следующего кода, но я застрял в том, как учесть знаки -/+ указанных чисел. Мне нужно перенести какой-либо знак на num1, а также вернуть положительное число, если num2 отрицательно - это поражает меня, как это сделать...:) Любая ясность будет принята с благодарностью! Я не совсем ищу прямой ответ, более того, мне кажется, что я упускаю что-то очевидное... Может быть, мне нужен новый подход?

    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

3 ответа

Решение

Вы могли бы переосмыслить это. Вы в основном сформулировали решение в своем вопросе:

Мне нужно перенести какой-либо знак на num1, а также вернуть положительное число, если num2 отрицательный

Вторая часть не точна, но я подозреваю, что вы просто ошиблись. Положительное число должно быть возвращено, когда 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%;}

Если вы подумаете о математическом процессе вычисления модуля, вы сможете увидеть, как вы можете это сделать, не прибегая к куче операторов case. Вместо этого думайте об этом так, вы просто вычисляете остаток:

Учитывая 2 числа а и б, вы можете вычислить 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
}

Это вернет те же значения, что и при использовании%

Это основная формула:dividend = divisor * quotient + remainderИз этого уравнения вы можете вычислить остаток.

Другие вопросы по тегам