Ближайшее к n число, которое является фактором m - PullRequest
0 голосов
/ 30 мая 2018

Итак, я ищу алгоритм, способный дать мне самое близкое к n число, которое является множителем m.

В случае, если я формулирую этот вопрос глупо, я приведу несколько примеров:)

n = 10;м = 400;выход: 10

n = 11;м = 400;выход: 10

n = 16;м = 400;выход: 16

n = 17;м = 400;выход 16

n = 19;м = 400;выходной 20

Я чувствую себя глупо сейчас.Я мог бы просто грубо заставить это сделать несколько петель, я думаю, но это не правильно.В настоящее время я делаю это в Python, но если бы я знал формулу, я думаю, это не имеет значения, какой язык я использую.

Редактировать: Итак, я создаю его с циклом while в JavaScript, и он работает, но я бывсе еще хочу более элегантное решение.

export const closestNumber = (n, m) => {
  if (m % n !== 0) {
    let p = 0;
    while (true) {
      p += 1;
      if (m % (n + p) === 0) {
        return Math.abs(n + p);
      }
      if (m % (n - p) === 0) {
        return Math.abs(n - p);
      }
    }
  }
  return Math.abs(n);
};

Заранее спасибо, парни и девушки.Я знаю, что здесь много умных людей.:)

1 Ответ

0 голосов
/ 26 июня 2018

Лучший способ - найти все факторы числа и сравнить число с каждым фактором.

Более короткий способ найти все факторы:

// find each factors
    var i=2;
    var diviseurs=[1];
    for(var d=1;d<Math.sqrt(n)+1;d++)
        for(var mult=d;mult<n;mult++)
            if(d*mult == n){
                if(d==mult){
                    diviseurs.push(d);
                }else{
                    diviseurs.push(d);
                    diviseurs.push(mult);
                }
        }
    diviseurs.push(n);

Вы найдете каждыйпервые простые множители до sqrt (число) (потому что их больше нет), и вы добавляете в список факторов каждый множитель, кратный числу.

Мы также можем сравнивать, пока находим факторы.Я могу улучшить это, если хотите.

<html>

<head>
	<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
</head>

<script language="javascript" type="text/javascript">

function closestNum(){
	var n = parseInt(document.getElementById("num1").value);
	var m = parseInt(document.getElementById("num2").value);

	// find each factors
	var i = 2;
	var diviseurs = [1];
	for( var d=1; d < Math.sqrt(n)+1 ; d++){
		for(var mult = d; mult < n; mult++)
			if(d*mult == n){
				if(d == mult){
					diviseurs.push(d);
				}else{
					diviseurs.push(d);
					diviseurs.push(mult);
				}
		}
	}
	diviseurs.push(n);


	// find closest
	var closest = diviseurs[0];
	var diff = Math.abs (m - closest);
	for (var val = 0; val < diviseurs.length; val++) {
		var newdiff = Math.abs(m - diviseurs[val]);
		if (newdiff < diff) {
			diff = newdiff;
			closest = diviseurs[val];
		}
	}

	console.log("diviseurs :",diviseurs);
	console.log("closest :",closest);
	document.getElementById("res").innerHTML = closest;
}

</script>

<body onload="closestNum()" lang="fr-FR">

<span>number</span><br/>
<input type="number" value="400" id="num1"/>
<br/>
<br/>
<span>closest from :</span><br/>
<input type="number" value="19" id="num2"/>
<br/>
<br/>
<span>closest factor :</span><br/>
<span id ="res"></span>

<br/>
<br/>
<button onclick="closestNum()">run</button>

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