面试题关于质数的求法

面试题关于质数的求法

100以内的所有质数的输出:
质数:素数,只能被1和他本身整除的自然数–>从2开始到这个数-1为止,都不能被这个数本身整除。代码如下:

class PrimeNumberTest {
	public static void main(String[] args) {
		boolean isFlag = true;//定义一个Flag,表示i是否被j除尽,一旦除尽,修改其值
		for (int i = 2; i <= 100 ; i++ ){//从2开始遍历100以内的自然数
			for (int j = 2; j < i ; j++ ){//j被i去除
				if (i % j == 0){//i被j除尽
					isFlag = false;
			   }
		    }
			if (isFlag == true){
				System.out.println(i);
			}
			isFlag = true;//重置isFlag
		}
	}
}

这种代码很明显就是提前声明了一个 isFlag = true;这一句是重点也是代码的关键,for的2层嵌套循环并不能有效的判断出该数字是否为质数,加入这条代码,让其能够完美的判断了这个数是否为质数,因为除了能被整除的数剩下的肯定是质数啊。如果觉得这种方法抽象,可以把整个过程想象成医院检查身体的过程,从1号到n号(穿着true的白衣服,等待医生的审判)排着队伍,轮流进去被医生检查,如果发现你不是质数,那么医生就会在你的白衣服上写一个大大的 “×” 号,出来的时候有会有检票员把你的衣服收掉去掉 “×” 号重新给下个人穿,这就是为什么最后一句要重新赋值, 使isFlag = true的原因,这样就会不断的进行判断,最终找到n个数之内的所有质数了是不是很简单呢。
在这里插入图片描述
这种方法是最基本的方法之一,因为这种求质数的方法在求很大的一个范围之内的数的时间复杂度会很高,所以我在后面改进了代码后,可以明显看出改进后的效率是大幅度上升了一个档次。下面是我第一次改进后的代码:

/*
100000以内的所有质数的输出--->优化方式2
质数:素数,只能被1和他本身整除的自然数-->从2开始到这个数-1为止,都不能被这个数本身整除
对PrimeNumberTest质数输出问题的一个优化
*/
class PrimeNumberTest2 {
	public static void main(String[] args) {
		//获取当前时间距离1970-01-01 00.00.00的毫秒数
		long start = System.currentTimeMillis();
		int count = 0;
		Lable:for (int i = 2; i <= 100000 ; i++ ){//从2开始遍历100000以内的自然数
			//优化2:Math.sqrt()调用数学函数开方,对本身是质数的自然数是有效的
			for (int j = 2; j <= Math.sqrt(i) ; j++ ){//j被i去除

				if (i % j == 0){//i被j除尽
					continue Lable;	
			   }
		    }
			//能执行到此步骤的都是质数。
			count++;
		}
		//获取当前时间距离1970-01-01 00.00.00的毫秒数
		long end = System.currentTimeMillis();
		System.out.println("所有质数的个数为:" + count);
		System.out.println("所花费的时间为:" + (end - start));//35690 --->优化一后:3040 ---> 优化二后:1174
	}
}

这次的改进使得代码的时间复杂度降低了很多,因为去记录一下时间的大小,所以我选择了100000这个数,可以很明显的看出时间的改变。最后,给一下我的最终版本的代码,也是我最喜欢的版本之一,收藏哦记得~~

/*
100000以内的所有质数的输出--->优化方式2
质数:素数,只能被1和他本身整除的自然数-->从2开始到这个数-1为止,都不能被这个数本身整除
对PrimeNumberTest质数输出问题的一个优化
最终版本:使用了continue的方法完美的解决了质数的问题。
*/
class PrimeNumberTest2 {
	public static void main(String[] args) {
		//获取当前时间距离1970-01-01 00.00.00的毫秒数
		long start = System.currentTimeMillis();
		int count = 0;
		Lable:for (int i = 2; i <= 100000 ; i++ ){//从2开始遍历100000以内的自然数
			//优化2:Math.sqrt()调用数学函数开方,对本身是质数的自然数是有效的
			for (int j = 2; j <= Math.sqrt(i) ; j++ ){//j被i去除
				if (i % j == 0){//i被j除尽
					continue Lable;	
			   }
		    }
			//能执行到此步骤的都是质数。
			count++;
		}
		//获取当前时间距离1970-01-01 00.00.00的毫秒数
		long end = System.currentTimeMillis();
		System.out.println("所有质数的个数为:" + count);
		System.out.println("所花费的时间为:" + (end - start));//35690 --->优化一后:3040 ---> 优化二后:1174
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值