求质数到性能优化之一二

求质数这个问题在我们学编程之初会经常遇到,如下代码:

	console.time('prime');
	// 遍历2-10000
	for(var i = 2; i < 10000; i++) {
		// 设置标志变量
		var isPrime = true;
		// 循环判断
		for (var j=2; j < i; j++) {
			if(i%j == 0){
				isPrime = false;
			}
		}
		// 是否为质数
		if (isPrime) {
			console.log(i);
		} 
	}
	console.timeEnd('prime');
复制代码

上述代码,是可以求出2-10000之内的质数,但是这段代码是否完美?

下面思考两个问题:

  • 当出现一个数,可以被整除,那么接下来的数还需要取余吗?
  • 内层循环是不是可以不必要遍历到i

基于以上两个问题修改代码为:

	console.time('prime');
	// 遍历2-10000
	for(var i = 2; i < 10000; i++) {
		// 设置标志变量
		var isPrime = true;
		var innerCount = Math.sqrt(i);
		// 循环判断
		for (var j=2; j < innerCount; j++) {
			if(i%j == 0){
				isPrime = false;
				break;
			}
		}
		// 是否为质数
		if (isPrime) {
			console.log(i);
		} 
	}
	console.timeEnd('prime');
复制代码

-------------------------------我是一条分割线---------------------------- 那么我们就看一下上边两段代码运行的时间,根据i的不同两段代码运行时间如下:

可以看出,当i是10000是效率还是提高的蛮高滴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值