javascript 怎么输出指定输入范围内的质数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 怎么输出指定输入范围内的质数相关的知识,希望对你有一定的参考价值。
wei521su这种遍历方法,范围在1到10000性能勉强可以接受, 范围超过10000时耗时估计超过3分钟,几次提示“很慢建议停止脚步”;
从减少开辟变量和遍历次数进行优化,发现还是很卡;
再大范围需要改进算法(eg:用哈希算法,将数据先吃到内存),不然估计出不来了;
<html>
<head>
<script type="text/javascript">
function getzhishu(num1,num2)
var sum = 0,j,indexMax;
if(num1<2 && num2===2)
sum++;
document.write(2+"|");
else if(num1<2 && num2>=3)
sum+=2;
document.write(2+"|");
document.write(3+"|");
else if(num2>=3 && num1>=3)
sum++;
document.write(3+"|");
for(var i=5;i<num2;i++)
indexMax = parseInt(i/2);
for(j=2;j<indexMax;j++)
if(i%j==0)
break;
if(indexMax == j)
sum++;
document.write(i+"|");
document.write("<br>"+sum);
getzhishu(1,10000);
</script>
</head>
<body><font color="red">Hi!</font></body>
</html>
使用了一层hash改进的方法:
在IE6测试了100000条,在首次加载很慢,以后调用相当地快;
IE8需要设置IE最大运行脚本语句数,调够大,不然老是提示“是否停止脚本运行”;
<html>
<head>
<script type="text/javascript">
var HashPool = function(size)
this.size = size;
this.pool = new Array();
this.loadPool(100000);
HashPool.prototype.loadPool = function(nr)
var sum=5,j,indexMax;
var arr = new Array();
this.pool.push(arr);
arr.push(2);
arr.push(3);
for(var i=5;i<=nr;i++)
sum++;
if(sum>this.size)
sum=1;
arr = new Array();
this.pool.push(arr);
indexMax = parseInt(i/2);
for(j=2;j<indexMax;j++)
if(i%j==0)
break;
if(indexMax == j)
arr.push(i);
HashPool.prototype.writeAll = function()
var i,j;
for(i = 0; i<this.pool.length;i++)
for(j=0; j<this.pool[i].length;j++)
document.write(this.pool[i][j]+"\t");
HashPool.prototype.write = function(nl,nr)
var arr = this.getZhiShu(nl,nr);
for(var i = 0; i<arr.length;i++)
document.write(arr[i]+"\t");
document.write("<br>总数:"+arr.length);
HashPool.sliceLeft = function(arr,value)
/* //遍历方式
if(arr[arr.length-1]<value)
return new Array();
for(var i=0;i<arr.length;i++)
if(value<=arr[i])
return arr.slice(i);
return [];*/
// 二分法
var index = HashPool.getIndex(arr,value);
if(index>=0)
if(arr[index] === value || index === 0)
return arr.slice(index);
return arr.slice(index+1);
return [];
HashPool.sliceRight = function(arr,value)
/* //遍历方式
if(arr[arr.length-1]<value)
return arr;
for(var i=0;i<arr.length;i++)
if(value===arr[i])
return arr.slice(0,i+1);
if(value<arr[i])
return arr.slice(0,i);
return [];*/
// 二分法
var index = HashPool.getIndex(arr,value);
if(index>0)
return arr.slice(0,index+1);
return [];
HashPool.getIndex = function(arr,v)
if(arr[arr.length-1]<v)
return arr.length-1;
else if(arr[0]>v)
return 0;
var l=0,r=arr.length-1,il;
while(l<=r)
il=parseInt((r+l)/2);
if(arr[il]<v && arr[il+1]>v)
return il;
else if(arr[il]===v)
return il;
else if(arr[il]>v)
r = il - 1;
else
l = il + 1;
return -1;
HashPool.prototype.getZhiShu = function(nl,nr)
var i,j,indexMax,lIndex,rIndex;
var resultArr = new Array(),lastArr = this.pool[this.pool.length-1];
if(nr - nl > 3*this.size)
if(nl<1)
alert("最小值:"+nl+"<1,程序默认设置最小值=1");
nl = 1;
document.getElementById("nleft").value = nl;
if(nr>lastArr[lastArr.length-1])
alert("最大值:"+nr+"<加载的最大值:"+lastArr[lastArr.length-1]+",程序默认设置最大值=加载的最大值");
nr = lastArr[lastArr.length-1];
document.getElementById("nright").value = nr;
lIndex = parseInt(nl/this.size);
rIndex = parseInt(nr/this.size);
resultArr = resultArr.concat(HashPool.sliceLeft(this.pool[lIndex],nl));
for(i = lIndex+1;i<rIndex;i++)
resultArr = resultArr.concat(this.pool[i]);
resultArr = resultArr.concat(HashPool.sliceRight(this.pool[rIndex],nr));
else
if(nl<2 && nr===2)
resultArr.push(2);
else if(nl<2 && nr>=3)
resultArr.push(2);
resultArr.push(3);
else if(nr>=3 && nl>=3)
resultArr.push(3);
for(i=5;i<=nr;i++)
indexMax = parseInt(i/2);
for(j=2;j<indexMax;j++)
if(i%j==0)
break;
if(indexMax == j)
resultArr.push(i);
return resultArr;
var hashPool = new HashPool(500);
//hashPool.writeAll();
//hashPool.write(1,3000);
function submit()
var nl = parseInt(document.getElementById("nleft").value);
var nr = parseInt(document.getElementById("nright").value);
var arr = hashPool.getZhiShu(nl,nr);
document.getElementById("printDiv").innerText = arr.join("|") +"\n总数:"+arr.length;
</script>
</head>
<body><font color="red">Hi! 质数。<br>请输入一个范围:<br><br>
起始数字:<input type="text" value="" id="nleft"/>
终止数字:<input type="text" value="" id="nright"/>
<input type="button" value="输出" onclick="submit();"/>
<div id = 'printDiv'></div>
</font></body>
</html> 参考技术A function getzhishu(num1,num2)
for(var i=num1;i<num2;i++)
for(var j=2;j<i;j++)
if(i%j==0)
break;
if(i==j)
document.write("是质数");
num1,num2是你的区间
javascript 显示一定范围内的素数(质数)转
//<span style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 21.6000003814697px;">素数又称质数,是大于1的自然数,并且只有1和它本身两个因数。</span><a target=_blank href="http://www.cnblogs.com/greenteaone/p/4210789.html">转文地址</a>
<!DOCTYPE HTML>
<html>
<head lang="en">
<meta charset="UTF-8">
<script type="text/javascript" src="http://files.cnblogs.com/greenteaone/jquery-2.1.3.min.js" charset="utf-8"></script>
<title></title>
</head>
<body>
<script type="text/javascript">
//方法1,当要求取得超过5000范围内的素数时,此法耗时少
function printPrime1()
var t1=new Date();
var n=$("#number").val();
var status=0;
var numbers='方法1:2,3';
var all=2;
console.log('素数=',2);
for(var i=5;i<n;i++)
for (var j = 2; j <= Math.sqrt(i); j++)
if (i % j == 0)
status = 0;
break;
else
status = 1;
if(status==1)
numbers=numbers+','+i;
all=all+1;
var t2=new Date();
var t=parseFloat(t2-t1);
$("#showTime1").html(t);
$('#all1').html('总的素数'+all+','+numbers);
//方法2:当要求取得小于5000范围内的素数时,此法耗时跟方法1相差不大
function printPrime2()
var t1=new Date();
var n=$("#number").val();
var status=0;
var all=1;
var numbers='方法2:2';
for(var i=3;i<n;i++)
for(var k=2;k<i;k++)
if(i%k==0)
status=0;
break;
else
status=1
if(status==1)
numbers=numbers+','+i;
all=all+1;
var t2=new Date();
var t=t2-t1;
$("#showTime2").html(t);
$('#all2').html('总的素数'+all+','+numbers);
function clearNumbers()
$('#all1').html('');
$('#all2').html('');
</script>
<style type="text/css">
input
text-align: center;
height:30px;
border:1px solid #CCC;
border-radius: 3px;
box-shadow:3px 3px lavender ;
button
box-shadow: 2px 3px lavenderblush;
height: 30px;
border-radius: 13px;
border: 1px solid #ccc;
background: coral;
label
width: 60px;
p
width:90%;
margin:auto;
word-break: break-all ;
line-height: 30px;
div
width:90%;
margin:auto;
</style>
<div>
<input type="text" id="number" placeholder="请输入数字" οnfοcus="clearNumbers()" />
<button οnclick="printPrime1()" >打印素数(方法1)</button>
<label>耗时</label>
<label id="showTime1"></label>
<button οnclick="printPrime2()" >打印素数(方法2)</button>
<label>耗时</label>
<label id="showTime2"></label>
</div>
<P id="all1" mode="wrap"></P>
<P id="all2"></P>
</body>
</html>
以上是关于javascript 怎么输出指定输入范围内的质数的主要内容,如果未能解决你的问题,请参考以下文章