来,我们先来科普一下数学概念
质数(又称为素数):只能被1和它本身整除的自然数。
基本思想:即从2开始,到这个数-1结束为止,都不能被这个数本身整除。
二话不说,咱先来康康四位仙女姐姐来写写代码。
您品,您细品
康康哪位代码写的最优、哪个最合你口味
翠花妹妹
public class Test01 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long start = System.currentTimeMillis();
for(int i = 2;i <= 10000;i++) {//遍历1000000以内的自然数
for(int j = 2;j < i;j++) {//j:被i去除
if(i % j == 0) {//i被j除尽
isFlag = false;
}
}
if(isFlag) {
//输出质数
//System.out.println(i);
//为了比较算法性能,直接计算质数个数,而不输出
count++;
}
isFlag = true;//重置isFlag
}
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long end = System.currentTimeMillis();
System.out.println("执行程序所使用的时间:" + (end - start));//606ms
System.out.println("质数个数:" + count);
}
}
貂蝉姐姐
public class Test02 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long start = System.currentTimeMillis();
for(int i = 2;i <= 10000;i++) {//遍历1000000以内的自然数
for(int j = 2;j < i;j++) {//j:被i去除
if(i % j == 0) {//i被j除尽
isFlag = false;
break;
}
}
if(isFlag) {
//输出质数
//System.out.println(i);
//为了比较算法性能,直接计算质数个数,而不输出
count++;
}
isFlag = true;//重置isFlag
}
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long end = System.currentTimeMillis();
System.out.println("执行程序所使用的时间:" + (end - start));//76ms
System.out.println("质数个数:" + count);
}
}
黛玉妹妹
public class Test03 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long start = System.currentTimeMillis();
//优化二:对本身是指数的自然数是有效的;
for(int i = 2;i <= 10000;i++) {//遍历1000000以内的自然数
for(int j = 2;j <= Math.sqrt(i);j++) {//j:被i去除
if(i % j == 0) {//i被j除尽
isFlag = false;
}
}
if(isFlag) {
//输出质数
//System.out.println(i);
//为了比较算法性能,直接计算质数个数,而不输出
count++;
}
isFlag = true;//重置isFlag
}
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long end = System.currentTimeMillis();
System.out.println("执行程序所使用的时间:" + (end - start));//13ms
System.out.println("质数个数:" + count);
}
}
玉环大娘
public class Test04 {
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<= 10000;i++) {//遍历1000000以内的自然数
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("执行程序所使用的时间:" + (end - start));//6ms
System.out.println("质数个数:" + count);
}
}
各位看官,相信你们已经发现四位仙女姐姐写的代码几乎一样,最大的区别在两个for循环的控制,控制条件不一样,算法性能不一样。