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 怎么输出指定输入范围内的质数的主要内容,如果未能解决你的问题,请参考以下文章

利用数组下标对应指定范围内的质数,利用数组布尔类型值标志是否为质数

javascript 显示一定范围内的素数(质数)转

196. 质数距离筛指定一个大区间内的质数

「C语言」「算法」输出指定范围内的素数

质数的问题?

寻找一定范围内的质数.md