如何获取可以划分数组中所有值的数字

时间:2018-05-22 07:17:35

标签: javascript arrays division

我正在编写一个函数,它可以给出可以分割数组中所有数字的数字。

int PRETTY_PRINT_INDENT_FACTOR = 4;
String TEST_XML_STRING =
        "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to 
JSON</test>";

try {
     JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
     String jsonPrettyPrintString = 
xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
     System.out.println(jsonPrettyPrintString);
} catch (JSONException je) {
     System.out.println(je.toString());
}

然而,它给了我所有可以划分每个数字的数字:

function scf(array){
  var newarray = [];
  for (var i = 0; i < array.length; i++) {
    for (var num = 1000; num > 1; num--) {
      if (array[i] % num === 0) {
        newarray.push(num);
      }
    }
  }
  return newarray
}
scf([133, 147, 427, 266])

我希望它只能给出能够分割数组中所有四个数字的数字(在这种情况下它将是[7])。

请帮忙吗?

5 个答案:

答案 0 :(得分:1)

在数组中生成从2到最小值的数字会更容易,然后使用filter测试every生成数字:

const scf = input => (
  Array.from(({ length: Math.min(...input) - 1 }), (_, i) => i + 2)
    .filter(testNum => (
      input.every(item => item % testNum === 0)
    ))
);
console.log(scf([133, 147, 427, 266]));
console.log(scf([6, 12, 18]));

答案 1 :(得分:1)

您可以使用filter方法获取数字,它可以划分 array中的所有值。

此外,使用spread syntax以查找给定数组的最小值,并将其用作{em>生成所有Array.from值的2...min函数的参数

&#13;
&#13;
function scf(arr){
  let min = Math.min(...arr);
  return Array.from(Array(min - 1)).map((_, k) => k + 2).filter(num => arr.every(item => item % num == 0));
}

console.log(scf([133, 147, 427, 266]))
&#13;
&#13;
&#13;

答案 2 :(得分:1)

 function scf(array){
          var newarray = [];
          for (var num = 1000; num > 1; num--) {
            var count = 0;
            for (var i = 0; i < array.length; i++) {
              if (array[i] % num === 0) {
              {
                  count = count + 1;
              }
            }
            if(count==array.length)
                newarray.push(num);
          }
          return newarray;
        }

答案 3 :(得分:0)

你可以保留函数的精度,但只取一个值来得到除数。稍后通过检查常用值来减少数组。

function scf(value) {
    var result = [],
        num;
    for (num = Math.floor(value / 2); num > 1; num--) {
        if (value % num === 0) {
            result.push(num);
        }
    }
    return result;
}

console.log(
    [133, 147, 427, 266]
        .map(scf)
        .reduce((a, b) => a.filter(v => b.includes(v)))
);

答案 4 :(得分:0)

我认为你可以把阵列中所有数字的GCD拿走,这样就可以得到你的号码。这会将你阵列中的每一个都分开。

此外,找到两个数字的gcd的时间复杂度是对数的,因此整体复杂度将为O(nlog(n)),其中n是数组中元素的数量。此外,

  

gcd(a,b,c)= gcd(a,gcd(b,c))