我正在编写一个函数,它可以给出可以分割数组中所有数字的数字。
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])。
请帮忙吗?
答案 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
函数的参数
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;
答案 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))