Java4Android自学记录(8-2):练习课 - 素数

1 目录及资源索引

  Java4Android自学过程目录及资源索引

2 题目及实际练习

  题目:打印出 100 - 200 之间的所有素数。按照老师讲的步骤如下:

  1. 定义一个类,名为:TestPrimeNumber;
  2. 在类当中定义主函数;
  3. 用 for 循环打印出所有在 100 - 200 中的数字;
  4. 每当循环执行一次,就判断循环变量的值是否为素数,如果是,就将循环变量的当前值打印出来。
  5. 如果判断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);		// 如果为素数,就打印出来
			}			
		}
	}
}

  程序运行结果如下:
在这里插入图片描述
  上述代码,虽然可以运行,结果也出来了,但是对比看看老师的代码,又自己想了想,发现里边还是有很多不合适的地方,关键在于没有认真的分析一下。

  1. 内层 for 循环,最大取值为什么是小于 200 的?当 i = 150的时候,j 最大还是可以等于200,就不太合适,也没必要。
  2. 内层 for 循环中,还要在判断一次,i 与 j 是否相等,后续代码优化的话,这部分是完全可以省掉的。
  3. 接着对比老师代码后,觉得我自己加的这个标志位还是挺好的。不用都在 for 循环内完成。
  4. 在判断为非素数时,里边的 break,我感觉自己加的还是比较有用的,比如150,当他被2整除时,就不是素数了,剩下的被除数就没必要在一一判断了,直接跳出去循环,开始下一个的比较。

3 参考老师代码

  参考老师代码如下:
在这里插入图片描述
  对比看完老师的代码,觉得自己水平真菜,写的这么长,这么复杂,效率还不高。看一下老师代码中的优势:

  1. 内层 for 循环,变量取值范围为:2 ~ (i - 1),这样就不用担心 j 的值比 i 大,也不用担心两个变量相等的情况。
  2. 在判断为非素数时,加上 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 总结

  1. 熟练了 for 循环的使用,但是还需要加强;
  2. 对 for 循环使用不够熟练,思维逻辑还需要提升,在一些时候,只需要更改一下循环条件就能省去好多判断,可是我没有想起来,导致要增加好几层判断。
  3. 遗留问题,看后续时间,或者刚好遇到的话,再做进一步测试。
  4. 参考老师的代码,学了很多,老师的代码风格简洁,思路清晰,我自己的还有待提高。
发布了88 篇原创文章 · 获赞 84 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Fighting_Boom/article/details/104207146
今日推荐