今天遇到一道笔试题,请大家帮忙看一下,有遗漏的话留一下言,谢谢(补救)

博主分享了一道笔试题,要求编写一个函数判断1000000以内的整数是否为素数,同时要优化代码以确保执行时间不超过32毫秒。文章中提到了一种思路,通过取余数来检测,一旦发现有余数为0,则立即判断为非素数。由于最初的实现超时,博主正在寻求改进方案并感谢读者的建议和帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写一个函数,要求参数是一个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)
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值