循环结构练习(质数)
循环结构练习(质数)
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));
浙公网安备 33010602011771号