最接近n的数字是m的因子

时间:2018-05-30 17:50:18

标签: algorithm math

所以我正在寻找能够给出最接近n的数字的算法,该算法是m的因子。

如果我把这个问题写成愚蠢的话,我将提供一些例子:)

n = 10; m = 400;输出:10

n = 11; m = 400;输出:10

n = 16; m = 400;输出:16

n = 17; m = 400;输出16

n = 19; m = 400;输出20

我现在感到愚蠢。我可以用一些循环来强行推测这个但是我感觉不对。我现在正在python中做这个,但如果我知道这个公式,我想我使用的语言并不重要。

编辑:所以我在javascript中使用while循环构建它并且它正在工作但我仍然想要一个更优雅的解决方案。

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 :(得分:0)

最好的方法是找出数字的每个因素,并将数字与每个因素进行比较。

查找所有因素的较短方法是:

form = new FormData();
features = $.map($('[name^="feature"]'), function(item, index){if($(item).val()=='1'){return $(item).attr('name').replace(/[^0-9]/g, '');}});
form.append('features', features);
$.ajax({
    url: url,
    type: 'POST',
    dataType: 'json',
    enctype: 'multipart/form-data',
    cache: false,
    processData: false,
    contentType: false,
    data: form,
    complete: function(response)
    {
        //
    }
});

您找到直到sqrt(number)的每个第一个素因数(因为在此之后它们不再存在) 然后将所有素数添加到因子列表中。

我们还可以在发现因素的同时进行比较。如果您愿意,我可以改善。

// 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);