1 目录及资源索引
2 题目及实际练习
题目:打印出 100 - 200 之间的所有素数。按照老师讲的步骤如下:
- 定义一个类,名为:TestPrimeNumber;
- 在类当中定义主函数;
- 用 for 循环打印出所有在 100 - 200 中的数字;
- 每当循环执行一次,就判断循环变量的值是否为素数,如果是,就将循环变量的当前值打印出来。
- 如果判断n是否为素数,首先用 2 除 n,如果除不尽,再用3,以此类推,如果从 2 到 n - 1 都无法整除n,那么n就位素数。
首先根据步骤,自己写了一段代码如下:
class TestPrimeNumber
{
public static void main(String args[])
{
boolean bFlag = false; // 定义一个标志位
for(int i = 100; i <= 200; i++) // 外层for循环 除数
{
for(int j = 2; j <= 200; j++) // 内层for循环 被除数
{
if(i != j)
{
if( 0 == (i % j) )
{
bFlag = false; // 如果能被整除 把对应标志位置为假
break; // 如果能被整除,直接判定为非素数,跳出进行下一个
}
else
{
bFlag = true; // 否则置为真 即为素数
}
}
}
if(bFlag)
{
bFlag = false; // 清空对应标志位
System.out.println(i); // 如果为素数,就打印出来
}
}
}
}
程序运行结果如下:
上述代码,虽然可以运行,结果也出来了,但是对比看看老师的代码,又自己想了想,发现里边还是有很多不合适的地方,关键在于没有认真的分析一下。
- 内层 for 循环,最大取值为什么是小于 200 的?当 i = 150的时候,j 最大还是可以等于200,就不太合适,也没必要。
- 内层 for 循环中,还要在判断一次,i 与 j 是否相等,后续代码优化的话,这部分是完全可以省掉的。
- 接着对比老师代码后,觉得我自己加的这个标志位还是挺好的。不用都在 for 循环内完成。
- 在判断为非素数时,里边的 break,我感觉自己加的还是比较有用的,比如150,当他被2整除时,就不是素数了,剩下的被除数就没必要在一一判断了,直接跳出去循环,开始下一个的比较。
3 参考老师代码
参考老师代码如下:
对比看完老师的代码,觉得自己水平真菜,写的这么长,这么复杂,效率还不高。看一下老师代码中的优势:
- 内层 for 循环,变量取值范围为:2 ~ (i - 1),这样就不用担心 j 的值比 i 大,也不用担心两个变量相等的情况。
- 在判断为非素数时,加上 break,直接跳出,开始下一个数的判断,这样感觉可以提高一些效率。
4 改进测试
参考老师代码之后,做出了一些改进,改进后的代码如下:
class TestPrime
{
public static void main(String args[])
{
boolean bFlag = false;
for(int i = 100; i <= 200; i++)
{
for(int j = 2; j < i; j++) // 修改取值范围
{
if(0 == (i % j)) // 能被整除,则不是素数
{
bFlag = false;
break; // 非素数直接跳出
}
else
{
bFlag = true;
}
}
if(bFlag)
{
bFlag = false;
System.out.println(i); // 打印出素数的值
}
}
}
}
程序运行的结果如下:
在这期间实际测试了好几遍,不加打印时间的话,很难感觉出来效率有提升,不过我还是感觉这样对提高效率有帮助。后续看是否要做进一步测试。
5 总结
- 熟练了 for 循环的使用,但是还需要加强;
- 对 for 循环使用不够熟练,思维逻辑还需要提升,在一些时候,只需要更改一下循环条件就能省去好多判断,可是我没有想起来,导致要增加好几层判断。
- 遗留问题,看后续时间,或者刚好遇到的话,再做进一步测试。
- 参考老师的代码,学了很多,老师的代码风格简洁,思路清晰,我自己的还有待提高。