【发布时间】:2017-07-26 12:31:43
【问题描述】:
我制作了这个运行良好的素数分解程序。唯一的问题是,当输入很大时,它会冻结浏览器。我的目标是让整个计算持续更长时间,而不是冻结浏览器。我已经尝试了几种方法来解决这个问题。首先我尝试使用async + await sleep(ms)(我在for循环中输入了await sleep,因为我认为它们导致了过度计算问题)但由于某种未知原因它根本没有给出答案。我还尝试将函数拆分为三个较小的函数(每个 for 循环一个)并为每个函数使用 setTimeout,但效果不佳。我知道,可能有更简单的素数分解程序,但我想研究这个,因为我自己想出来了。顺便说一句,第一个调用的函数是factor1(num)
function factor1(num) {
if (primecheck(num)){
document.getElementById("resultingz").innerHTML = num + " is prime";
}else{
var finalito = [];
factor2(num, finalito);
document.getElementById("resultingz").innerHTML = finalito.toString();
}
}
function factor2(num, arrada){
var factors = [];
var factornums = [];
for (coun = 2; coun <= num/2; coun++) {
if (num % coun == 0) factornums.push(coun);
}
for (i=0; i < factornums.length; i++){
if (primecheck(factornums[i])){
factors.push(factornums[i]);
}
}
for (i = 0; i < factors.length; i++){
rightnow = factors[i];
while (num % rightnow == 0) {
arrada.push(factors[i]);
rightnow = rightnow * factors[i];
}
}
}
function primecheck(num){
var primestate = true;
for (coun = 2; coun <= Math.sqrt(num); coun++) {
if (num % coun == 0) primestate = false;
}
return primestate;
}
【问题讨论】:
-
定义“大数”。它在哪里结冰?调试应该很容易就能告诉你。
-
当我输入超过 6 位数的数字时,它开始冻结浏览器。
-
它“冻结”的行是: for (coun = 2; coun
-
@NiXt “冻结”是指浏览器在(或多或少)短时间内无响应,还是永远完全冻结?
-
请向我们展示您尝试过的
await sleep解决方案,它应该可以正常工作。
标签: javascript primes