2013-10-11 2 views
0

Я пытаюсь построить эту функцию, чтобы передать два числа пользователем и найти самый низкий общий кратный из двух чисел. Я пытался построить функцию, используя эту логику. Продолжайте умножаться до тех пор, пока результат двух чисел не будет равен друг другу. Мне нужна помощь в логике. Спасибо.Функция JavaScript для умножения двух чисел до тех пор, пока они не будут равны друг другу

function performCalc(one, two) { 
     var num1 = new Number; 
     var num2 = new Number; 
     var i = new Number(0); 

     var num1 = one; 
     var num2 = two; 

     var result1 = new Number; 
     var result2 = new Number; 

     do { 
      result1 = num1 * i; 
      result2 = num2 * i; 
      i++ 
     } 
     while (result1 != result2); 
     if (result1 == result2) { 
      return result1; 
     } 
    } 
+2

Кажется, что ваша функция ничего не возвращает. –

+0

Я думаю, вам нужно проверить результат1 по результату2 на цикле do, а затем разбить его и вернуть данные –

+1

Для ввода чисел 'x' и' y', ваша функция вычисляет все возможные 'x * k' и' y * k' для всех значений 'k'.Однако 'x * k == y * k' является истинным только в том случае, если' x == y' для всех значений 'k' (вы можете видеть это тривиально, разделив уравнение на' k'). Если вы хотите, чтобы наименьший общий знаменатель должен был проверить, что 'x/k' является круглым числом, или - в JS -' floor (num1/i) = (num1/i) 'или, быстрее,' (num1% i) == 0'. – SpaceDog

ответ

-2

может быть, это будет делать трюк:

do { 
    result1 = num1 * i; 
    result2 = num2 * i; 

    if(result1 == result2){ break; } 
    i++ 
} 

return result1; 

, как это кажется, что ваш код на бесконечный цикл, может быть, даже ограничить итерации с чем-то вроде

i++; 
if(i > 1000){ result1=0; break; } //if it tried 1000 times and found nothing, abort and return zero... 
+0

Кроме того, новый номер ошибочен, насколько я знаю, почему бы просто не инициализировать простым Zero, как var i = 0, result1 = 0, result2 = 0; –

+0

Я понятия не имею, зачем ему нужна эта функция, возможно, для какой-то домашней работы ... и действительно, value1 и value2 никогда не будут равны, поскольку они умножаются на одно и то же число (i), но я просто добавляю свои два цента с кажущейся бесконечной петлей do. Приветствия. –

+0

Вопрос запрашивает алгоритм получения LCM двух чисел. – luiges90

4

Это будет всегда возвращать 0, потому что i начинается с 0, поэтому result1 будет 0, а result2 будет 0.

Чтобы найти LCM, вы должны проверить различные наборы продуктов (например, в случае LCM(12, 18), вам нужно умножить 18 на 2 и 12 по 3).

Один из способов сделать это:

var i,j; 
for(i=1;i <= two; ++i) { 
    for(j=1; j<=one; ++j) { 
     if(one * i == two * j) { 
      return one * i; 
     } 
    } 
} 
+0

Простой, медленный, но рабочий метод, по крайней мере для небольших чисел – luiges90

+1

@ luiges90 существует гораздо более эффективный способ вычисления LCM, например, вычисление GCD с использованием метода евклида, а затем вычисление одного * двух/GCD (один, два), но OP требует инкрементного метода – SheetJS

0

Проблемой с вашим решением является то, что, в то время как result1 и result2 могут в разное время занимали эквивалентные значения, они будут только когда один и то же значение, в то же время если Ваши оригинальные входы one и two идентичны. Поскольку ваше условие возврата зависит от эквивалентности этих двух значений, вы получаете функцию, которая возвращается только тогда, когда one==two. Пример вашей петли с входами 3 и 5 бы

  1. = 0, результат1 = 0, результат2 = 0
  2. = 1, результат1 = 3, результат2 = 5
  3. = 2 , result1 = 6, result2 = 10

... до бесконечности, где result1 никогда не равна result2.

Лучшим решением будет принимать значение a (где a является аргумент с наименьшим абсолютным значением) и повторно добавить номер к себе, пока общая сумма ret прекрасно делится на обоих a и b. Мы можем использовать modulo operator, чтобы проверить это условие. Такой подход также позволяет рассчитать «отрицательное наименьшее общее кратное», если это необходимо:

function lowest_common_multiple(a,b) { 
    var max = Math.max(a,b), 
     min = Math.min(a,b); 
    if(Math.abs(max + min) <= Math.abs(max)) { 
     return 0; 
    } 
    var abs_min = (Math.abs(a) < Math.abs(b)) ? a : b; 
    var ret = abs_min; 
    while(1) { 
     ret += abs_min; 
     if(!(ret % a || ret % b)) { 
      return ret; 
     } 
    } 
} 

console.log(lowest_common_multiple(11,27)); // >> +297 
console.log(lowest_common_multiple(-11,-27)); // >> -297 

Обратите внимание, что это возвращение реализации равна нулю, если пользователь переходит в ноль либо для (или оба) аргументы, или если один аргумент является положительным, а другое отрицательным.

Смежные вопросы