循环结构练习(质数)

循环结构练习(质数)

100以内所有质数(质数:只能被1和其本身整除/不能被2 ~ 其本身 - 1的数整除)

		// 未优化
		boolean isFlag = true;
		// 遍历100以内所有数字(1不是质数)
		for (int i = 2; i <= 100; i++) {
			// 遍历每个数字(2~其本身 -  1)
			for (int j = 2; j < i; j++) {
				// 判断这个数字是否能被2~其本身 - 1的数字整除
				if (i % j == 0) {
					// 被整除则不是质数
					isFlag = false;
				}
			}
			if (isFlag) {
				System.out.println(i);
			}
			// 重置 isFlag
			isFlag = true;
		}

		// 优化代码
		/*
		1. 所有偶数都不是质数(但是对于算法层面并没有优化)
		算法层面:时间复杂度 o(n) n ---> 2 ~ 100
		o(n) ---> n是 n-1/2n/1/2 n 都是o(n)级别
		 */
		// 获取当前时间毫秒数/当前时间距离1970-01-01-00.00.00的毫秒数(判断运行速度)
		long strat = System.currentTimeMillis();
		boolean isFlag = true;
		int count = 0;
		// 遍历100以内所有数字(1不是质数)
		for (int i = 2; i <= 100000; i++) {
			// 遍历每个数字(2~其本身 -  1)
			/*
			优化3 不能被2~其临界值整除(先二分 一个数字除以一半以上肯定不能除尽 然后再二分 因为50/2=25和50/25=2 相同 然后不断二分直到这个数字除以一个数字
			等于除的那个数字(就是只保留左边抛弃右边)临界值就是根号这个数字)一个数字的临界值就是这个数字开根号(适用于判断范围内整除等/就相当于能否被n~临界值整除)
			 */
			// 优化后19ms
			for (int j = 2; j < Math.sqrt(i); j++) {
				// 判断这个数字是否能被2~其本身 - 1的数字整除
				if (i % j == 0) {
					// 被整除则不是质数
					isFlag = false;
					// 优化1:只对本身非质数的自然数是有效的(优化前16752ms)
					break;// 优化后 1860ms
				}
			}
			if (isFlag) {
				// 优化2 取消输出(cpu 写读文件从内存加载到 cpu 影响时间)
				// System.out.println(i);
				count++;// 优化后 1236ms
			}
			// 重置 isFlag
			isFlag = true;
		}
		// 获取当前时间毫秒数/当前时间距离1970-01-01-00.00.00的毫秒数(判断运行速度)
		System.out.println("100000以内质数的个数为:" + count);
		long end = System.currentTimeMillis();
		System.out.println("程序执行时间(毫秒):" + (end - strat));

		long strat = System.currentTimeMillis();
		int count = 0;
		// 遍历100以内所有数字(1不是质数)
		lable:for (int i = 2; i <= 100000; i++) {
			for (int j = 2; j < Math.sqrt(i); j++) {
				if (i % j == 0) {
					// 如果不是质数则开始下一个数字的判断
					continue lable;
				}
			}
			// 能执行到此步骤的都是质数
			count++;
		}
		System.out.println("100000以内质数的个数为:" + count);
		long end = System.currentTimeMillis();
		System.out.println("程序执行时间(毫秒):" + (end - strat));
posted @ 2021-03-26 15:35  weinen  阅读(206)  评论(0)    收藏  举报