Javascript素数分解代码冻结为大量数字
我制作了这个素因子分解程序,效果非常好。唯一的问题是,当输入的是一个大数字时,它会冻结浏览器。我的目标是使整个计算持续更长时间,而不是冻结浏览器。我尝试了几种方法来解决这个问题。首先,我尝试使用Javascript素数分解代码冻结为大量数字,javascript,primes,Javascript,Primes,我制作了这个素因子分解程序,效果非常好。唯一的问题是,当输入的是一个大数字时,它会冻结浏览器。我的目标是使整个计算持续更长时间,而不是冻结浏览器。我尝试了几种方法来解决这个问题。首先,我尝试使用async+等待睡眠(ms)(我在for循环中键入了wait-sleep,因为我认为它们导致了过度计算的问题),但由于一些未知的原因,它根本没有给出答案。我还尝试将函数拆分为三个较小的函数(每个for循环一个),并对每个函数使用setTimeout,但效果并不理想。我知道,可能还有更简单的素因子分解程序,
async
+等待睡眠(ms)
(我在for循环中键入了wait-sleep,因为我认为它们导致了过度计算的问题),但由于一些未知的原因,它根本没有给出答案。我还尝试将函数拆分为三个较小的函数(每个for
循环一个),并对每个函数使用setTimeout
,但效果并不理想。我知道,可能还有更简单的素因子分解程序,但我想做这一个,因为我自己发现了。顺便说一下,调用的第一个函数是factor1(num)
函数系数1(num){
if(primecheck(num)){
document.getElementById(“resultingz”).innerHTML=num+“是prime”;
}否则{
var finalito=[];
系数2(数值,最终值);
document.getElementById(“resultingz”).innerHTML=finalito.toString();
}
}
函数系数2(数值,数组){
var因子=[];
var系数=[];
对于(coun=2;coun一些改进:
function factor2(num, arrada){
for (coun = 2; coun <= num/2; coun++) {//one loop instead of three
if (num % coun == 0 && primecheck(coun)){
var rightnow=coun;
while (num % rightnow == 0) {
arrada.push(coun);
rightnow = rightnow * coun;
}
}
}
}
function primecheck(num){
var primestate = true,num=Math.sqrt(num);//performance improvement
for (var coun = 2; coun <=num; coun++) {
if (num % coun == 0){
primestate = false;
break;//stop loop if false found
}
}
return primestate;
}
一些改进:
function factor2(num, arrada){
for (coun = 2; coun <= num/2; coun++) {//one loop instead of three
if (num % coun == 0 && primecheck(coun)){
var rightnow=coun;
while (num % rightnow == 0) {
arrada.push(coun);
rightnow = rightnow * coun;
}
}
}
}
function primecheck(num){
var primestate = true,num=Math.sqrt(num);//performance improvement
for (var coun = 2; coun <=num; coun++) {
if (num % coun == 0){
primestate = false;
break;//stop loop if false found
}
}
return primestate;
}
定义“大数字”。它在哪里冻结?调试应该可以很容易地告诉您。当我输入超过6位的数字时,它开始冻结浏览器。它“冻结”的行是:for(coun=2;coun@NiXt By“冻结”,您的意思是浏览器对a(或多或少)没有响应吗很短的时间,或者它会永远冻结?请向我们展示您尝试的等待睡眠
解决方案,它应该可以正常工作。定义“大数字”。它在哪里冻结?调试应该可以很容易地告诉您。当我输入超过6位的数字时,它会开始冻结浏览器。以及它“冻结”的行is:for(coun=2;coun@NiXt)中的“冻结”是指浏览器对(或多或少)的时间没有响应吗很短的时间,或者它会永远冻结?请向我们展示您尝试过的等待睡眠
解决方案,它应该可以正常工作。首先,我从来没有使用过伪递归函数,我不知道它们是如何工作的,所以我想对此进行更多的解释。此外,我只是尝试了您提出的改进代码ed,它对我不起作用。@NiXt,是的,我将添加ab解释,但是不起作用对我没有帮助…好吧,它没有给出正确的答案,例如,我刚刚尝试了50,答案是2,5,5,10@NiXt你是舒尔吗?你的函数返回了不同的值?是的,我检查了两个值是否相同。我的函数返回了2,5,5 firs当然,我从来没有使用过伪递归函数,我也不知道它们是如何工作的,所以我想再解释一下。另外,我只是尝试了你提出的改进代码,但它对我不起作用。@NiXt,是的,我将添加ab解释,但是不起作用对我没有帮助……嗯,它没有给出正确的ans举个例子,我刚试了50次,结果是2,5,5,10@NiXt你是舒尔吗?你的函数返回了不同的值?是的,我检查了两个值是否相同。我的函数返回了2,5,5
for(var counter=start;counter<max;counter++){
code;
}
end();
(function iterate (counter){
if(counter>=max) return end();//end is a callback
code;
setTimeout(iterate,0,counter+1);//next tick, continue with counter+1
})(start);//start the function with a start value