Как я могу создать цикл for, который увеличивает число до тех пор, пока не найдет остаток от 0? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть функция, которая должна находить наименьшее общее кратное из предоставленных параметров, которые могут быть равномерно разделены на них обоих плюс те, которые находятся между ними.

Массив всегда состоит из двух чисел, которыеможет быть не в числовом порядке.

Например.Значение [1, 3] вернет 6, или [1, 5] будет 60.

  1. Я понимаю, что сначала мне нужно найти минимальное и максимальное число в массиве.
  2. Затем я должен поместить все числа в диапазоне минимальных и максимальных чисел, включая их оба, в массив.
  3. И затем мне нужно как-то создать цикл for, который увеличивает число донаходит остаток от 0, когда он делится на каждое число в массиве.

Третья часть, которую я понимаю, но не знаю, как реализовать.Любая помощь и советы будут высоко оценены.

Это мой код:

function smallestCommons(arr) {
  let minNum = Math.min(...arr);
  let maxNum = Math.max(...arr);
  let mySeq = [];
  for(let i = minNum; i <= maxNum; i++){
    mySeq.push(i);
  }
  // stuck here
}

Спасибо.

Ответы [ 5 ]

0 голосов
/ 04 октября 2018

Это была интересная проблема для решения.Я решил это таким образом, но я уверен, что есть лучшие пути.

Сначала я вычислил lmc между двумя самыми большими числами.

Затем я сравнил это число, умноженное на 1,затем 2, затем 3 и так далее, по модулю следующего наименьшего числа (максимальное число - 2), пока я не найду 0 в качестве результата.Затем я продолжал вычислять по модулю (максимальное число - 3), пока (максимальное число - n) = arr [0];

function lcm(nb1, nb2)
{
    let i = 1;
    let j = 1;
		
    while (true)
    {
        for (j = 1; j <= i; ++j)
        {
            if ((nb1 * i) == (nb2 * j))
                return (nb1 * i);
        }
        ++i;
    }
}
	
function smallestCommons(arr)
{
    if (arr.length == 2)
    {
        biggestNumber = arr[1];
        if (biggestNumber > 2)
        {
            let biggestCommon = lcm(arr[1] - 1, arr[1]);
            let mul = 1;
            for (let num = biggestNumber - 2; num > arr[0]; --num)
                while (((biggestCommon * mul) % num) != 0)
                    ++mul;
            return (biggestCommon * mul);
        }
        else
            return (biggestNumber);
    }
}
	
console.log(smallestCommons([1, 5]));
console.log(smallestCommons([1, 3]));
console.log(smallestCommons([1, 42]));
console.log(smallestCommons([7, 10]));
console.log(smallestCommons([4, 5]));
0 голосов
/ 04 октября 2018

Привет, этот код подходит для ваших сценариев.

        let array = [1,5];

        let returnValFunction = (arr) => {
            try {
                let minNum = Math.min(...arr);
                let maxNum = Math.max(...arr);
                let returnVal = false;
                let i = 1;
                while (!returnVal) {
                    let divingNum = maxNum * i;
                    let checkVal = true;
                    for (let a = maxNum; a >= minNum; a--) {
                        console.log('a', a);
                        console.log(Number.isInteger(divingNum / a));
                        !Number.isInteger(divingNum / a) ? checkVal = false : '';
                    }
                    if (checkVal) returnVal = divingNum;            
                    i++;
                };
                return returnVal;
            } catch(err) {
                console.log(err);
            }
        }

        let consoleValue = returnValFunction(array);
        console.log('consoleValue', consoleValue);
0 голосов
/ 04 октября 2018

Поскольку я не являюсь сотрудником JS, я могу дать вам псевдокод.

lcm = 1
list =[1,2,3]

for i in len(list)-1:
   lcm = lcm*list[i+1]/gcd(lcm,list[i+1])

print(lcm)

если нам необходимо найти lcm числа от 1 до n

иначе нам нужно будет инициализировать lcm с двумя первыми номерами списка.

0 голосов
/ 04 октября 2018

Один функциональный подход.

const range = ([min, max]) => {
  let arr = [];
  for (var i = min; i <= max; i++) arr.push(i);
  return arr;
};
const gcd = (a, b) =>  !b ? a : gcd(b, a % b);
const lcm = (a, b) => (a * b) / gcd(a, b);

const smallestCommons = (arr) => range(arr).reduce((acc, cur) => acc = lcm(acc, cur), arr[0]);

console.log(smallestCommons([1, 3])); // 6
console.log(smallestCommons([1, 6])); // 60
0 голосов
/ 04 октября 2018

Исходя из вашей идеи, я мог бы создать такую ​​функцию

function smallestCommons(arr) {
  let minNum = Math.min(...arr);
  let maxNum = Math.max(...arr);
  let mySeq = [];
  for(let i = minNum; i <= maxNum; i++){
    mySeq.push(i);
  }
  // stuck here
  let smallestCommon = maxNum;
  let found = false;
  while(!found){
    var j;
    for(j = 0; j< mySeq.length; j++){
      if(smallestCommon % mySeq[j] != 0) break;
    }
    if(j == mySeq.length){
      found = true;
    }else{
      smallestCommon ++;
    }
  }

  return smallestCommon;
}

smallestCommons([1, 3]) //return 6
smallestCommons([1, 5]) //return 60

Тем не менее, я думаю, что есть еще лучший способ решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...