写一个函数,要求参数是一个1000000以内的整数,并判断这个整数是不是素数。注意:代码要优化执行效率,执行时间不能超过32毫秒
第一种思路其实就是把数值和除了自己和1以外的所有的数值取余,并且计数中间不能被整除的,数量等于1~数值间的数字的数量那就是质数,但是这样太耗时
function fun(data){
var date=new Date().getMilliseconds()
var data1=parseInt(data);
if(data!=data1 || data<1000000){//将转整型后的数值和元数据比较,如果不同,则打印,并且停止运行
console.log(data+'不是整数')
return;
}
var sum=0
for(var i=2;i<=data-1;i++){//循环遍历1~data之间所有的整数
var j=data%i//取余
if(j!=0){//取余不为0,在次数上加1
sum+=1
}
}
var num=data-2
if(sum==num){//如果sum==1~data之间的数量,就证明除了1和data以外都能被整除,即为素数
var date1=new Date().getMilliseconds();
console.log(date1)
var time=date1-date
console.log('是素数',sum,time)
}else{//否则就不是
var date1=new Date().getMilliseconds();
console.log(date1)
var time=date1-date
console.log('不是素数',time)
}
}
fun(1000000)
第二种思路,是我在复盘时想到的,依然是用数值去取余,但是只要取余到有等于0的,那就其实已经说明这个值不是素数了,所以就打印不是素数,并且停止运行,如果整个流程没有停止运行,就打印是素数
function fun(data){
var date=new Date().getMilliseconds()
var data1=parseInt(data);
if(data!=data1 || data>1000000){//将转整型后的数值和元数据比较,如果不同,则打印,并且停止运行
console.log(data+'不是整数')
return;
}
for(var i=2;i<=data-1;i++){//循环遍历1~data之间所有的整数
var j=data%i//取余
if(j==0){//取余为0
var date1=new Date().getMilliseconds();
var time=date1-date;
console.log('不是素数',time);
return;
}
}
var date1=new Date().getMilliseconds();
var time=date1-date
console.log('是素数')
console.log(time)
}
fun(1000000)
请看到的朋友帮忙看下,或者有更好的方法也可以留言让我学习下,谢谢!
上面的代码经过大家提醒确实时间超过了32毫秒,所以我又看了一下其他的文章
function fun(data){
var date=new Date().getMilliseconds();
var data =parseInt(data);//9
for(var i=2;i<=data-1;i++){//循环遍历1~data之间所有的整数
//取余
if(data%i==0){//取余为0
//此处是做一下标记告知作用域内不是素数
var isTrue=false
}
}
if(isTrue==false){
var date1=new Date().getMilliseconds();
var time=date1-date
alert(data+'不是素数'+"用时"+time)
}else{
var date1=new Date().getMilliseconds();
var time=date1-date
alert(data+'是素数'+"用时"+time)
}
}
fun(999983)
其实在这个例子中我也注意到了其中i的作用域,之前一直没有注意到,一直以为i实在循环内的,但是这个例子中i也可以在循环外引用,如下:
function fun(data){
var date=new Date().getMilliseconds();
var data =parseInt(data);//9
for(var i=2;i<=data-1;i++){//循环遍历1~data之间所有的整数
//取余
if(data%i==0){//取余为0
//在取余为0时结束循环
break;
}
}
var date1=new Date().getMilliseconds();
var time=date1-date
//i<data时证明i是这个数时取余为0
if(i<data){
alert(data+'不是素数'+"用时"+time)
}else{
alert(data+'是素数'+"用时"+time)
}
}
fun(999983)