Javascript 该解决方案不适用于1到20之间的值

Javascript 该解决方案不适用于1到20之间的值,javascript,algorithm,Javascript,Algorithm,我想解决这个问题 2520是最小的数字,可以被1到10之间的每一个数字除,没有任何余数。 能被1到20的所有数整除的最小正数是多少 它与样本号2520配合得很好 但不是1-20之间的数字,它不会给我任何回报,那么我的错误是什么 函数findFactor(n,最大值){ var acc=0; 对于(var i=2;i 1e7)console.log(“限制”) }将max设置为20,然后循环依赖于2和max(20)之间的所有数字都是n的因子。如果n这是关于素数的,那么这种方法就行不通了。想想哪些

我想解决这个问题

2520是最小的数字,可以被1到10之间的每一个数字除,没有任何余数。 能被1到20的所有数整除的最小正数是多少

它与样本号2520配合得很好

但不是1-20之间的数字,它不会给我任何回报,那么我的错误是什么

函数findFactor(n,最大值){
var acc=0;
对于(var i=2;i 1e7)console.log(“限制”)

}
将max设置为20,然后循环依赖于2和max(20)之间的所有数字都是n的因子。如果n这是关于素数的,那么这种方法就行不通了。想想哪些素数构成了所有介于1和20之间的数,记住计算每个素数的最小值,然后将它们相乘得到解。例如,对于9,我们需要两个3,对于16,我们需要4个2,等等。

您的代码中有一些缺陷:

  • 您永远不会退出(var i=2520;true;++i)的循环
    。浏览器会冻结,即使存在匹配项,也不会记录任何内容

  • 您仅将
    i
    增加一个,这是多余的。增加20,因为你的答案必须能被20整除

  • acc+=!(n%i)?1 : 0;也是多余的。如果
    n%i!==0,仅返回false

考虑到所有这些更正,您可能会有如下情况:

函数findFactor(n,最大值){
对于(设i=2;i 1e10){
控制台日志(“限制”);
打破
}
}

log(`time-speed:${performance.now()-start}`)解决此问题的更有效方法是计算(lcm)。我们可以使用的基本思想类似于通过计算lcm(尽管我们不直接使用因子分解)

一些基础知识 我们可以表示
a
b
平均除以a | b,而不是除以a∤B如果两个数没有公因子,则它们是互质的;如果
a
b
是互质,则这也意味着
lcm(a,b)=a*b
m=lcm(a,b)
具有属性a | m和b | m,但不存在
m|n
)。因此,上文定义的
a
b
c
c | lcm(a,b)
,可根据
a
b
(见上文)对
lcm(a,b)
进行因式分解得出

实际执行情况 好了,这就是数字理论部分,是时候编写一些实际的代码了(以防万一你还读到这个:D)。至少我们现在有了一些非常漂亮的代码:


运行=函数(){
document.getElementById('output_id')。innerHTML='computing…'
var n=document.getElementById('input_n_id')。值;
//埃拉托斯坦筛,快而脏的方法
var primes=Array((n-1)>>1).fill(0).map((v,i)=>i*2+3).reduce((p,v)=>{!~p.findIndex(p=>!(v%p)))&&p.push(v);返回p;}[2]);
//实际计算n
var sol=primes.map(p=>Math.pow(p,Math.floor(Math.log(n)/Math.log(p)))
.减少((a,b)=>a*b,1);
//输出
document.getElementById('output_id')。innerHTML='Solution:'+sol;
}

开始

等待输入…

即使如此,1-20之间的数字也不是答案。请添加您将来试图解决的问题的描述(可能还有到源代码的链接)。您可以更优雅地解决此问题:解决方案是
2^n1*3^n2*5^n3*。*19^nx
,其中
n1=楼层(日志(2,20))
n2=楼层(日志(3,20))
,和
ni
等效。解释?或者文档基本思想与相同,但不是将每个数字从2分解为20,而是使用所有素数因子必须小于20的事实。然后,因为2^4是小于20的2的最大幂,所以我们使用它。对所有其他素数使用相同的原理。这也将涵盖所有非素数,因为它们是素数幂的乘积,其中幂总是小于简单素数幂的最大值。希望这有帮助,否则我会把它变成一个更广泛的答案。我不太明白原因,你能让答案更广泛吗?你能解释一下逻辑和操作吗?我正在学习解决这样的问题,只是第五个2520是可以被1-10的数字整除的最小整数,那么,既然没有一个小于2520的数字可以被1-20整除,那么为什么要在周期中改变
var i=2520
per
let i=n
10@J.Uchu好的,我们可以从2520开始,在这个特殊情况下。我将其更改为
n
,以使此解决方案适用于小于10的数字,并与第二个解决方案相比,正确测量其性能。
lcm(a, b, c) = lcm(lcm(a, b), c)
Assume m = lcm(a, b) and p | m
m = a * n1 = b * n2
m = a * p * n1_ = b * p * n2_
n1_ * p = n1
n2_ * p = n2
m_ * p = m
a|m_
b|m_
lcm(x^e1,x^e2) = x^e2, if e1 < e2
lcm(2,4,8,16, 3,9, 5, 7, 11, 13, 17, 19) = 
lcm(lcm(2, 4, 8, 16), lcm(3, 9), 5, 7, 11, 13, 17, 19) =
lcm(16, 9, 5, 7, 11, 13, 17, 19) =  
2^4 * 3^2 * 5^1 * 7^1 * ... * 19^1