Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript素数分解代码冻结为大量数字_Javascript_Primes - Fatal编程技术网

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