这个质数生成器在几个星期前就完成了,只不过那时没有创建这个博客,那么就以此作为这个博客的第一篇正式的文章。
质数验证部分
这一部分是整个程序的核心。
程序完成任务所需的时间在不同性能的电脑上不同,此部分中所有的数据是在我自己的电脑上得出来的。
第一版
第一行的 for 循环用来生成指定范围内的所有数字来给下面的部分计算,num1 和 num2 就是指定范围的数。因为 num1<=num2 这个判断语句,所以在输入的时候 num1 必须大于或等于 num2。当然,也可以在这个程序前面加上一个判断语句,自动将大的数赋值给 num2,小的数赋值给 num1。
第三行开始的if语句用于排除特殊情况。
第七行的 for 从大到小生成数字和num1求余。也正因为这样设计,导致程序效率底下,在我自己的电脑上花了4分钟多才计算出 1-100000 中所有的质数。
第二行的 int 用来初始化计数器,第十二行的 if 则是判断每次求余之后是否都不为 0。同样这种设计导致程序效率再度下降。
第二版
这一次把 if 判断换成了 switch 来判断。同样还是排除特殊的数字。
第十行判断非特殊数字只需要判断原先的一半,效率提升了不少。
删除了计数器,改用 boolean 来判断是否为质数,使得效率有细微的提升。
此时学到了 break; 这样一旦发现求余为 0 就不用继续判断,效率提升。
这次计算 1-100000 花了约 1 分钟。
第三版和第四版
更新太少直接合并在一起
只更新了第十行,j-- 变为j++,可以快速排除掉 2 以外的偶数。并且最大只计算到 根号num1 ,再次减少计算量。java中小数转整数默认向下取整,这不影响正常计算。
这次计算 1-100000 内所有质数花了 10 秒左右。
第五版
第二行考虑到每循环一次就开辟一次会耗费时间,自己测试了一下,发现开辟空间比修改数值花的时间多(尽管只多了一点点),但还是让 isIt 在循环外先创建好。
以此类推,原本第十行每判断一次就要开一次方,不如提前开方好,效果很不错。
计算 1-100000 内所有的质数只花了 1 秒。
封装
完整的程序
我没有制作任何图形化的功能。
代码中有注释,我就不再解释了。
(代码框左侧按钮可以将代码收起,如果太多的话。右侧按钮可以直接复制)
模块形式
学了java中的方法之后,我将其做成一个模块,方便调用。
调用的代码:
primeNumberCalculation.primeNumberCalculation(num1)
num1是要检测的数值,范围在1~2147483646,类型为int
程序会返回boolean类型的值,true即为质数,false即为合数