求自然数的质数的解法和优化
一,质数的概念
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
二,思路
①需要让每个数与其前面的数(除了1和本身)进行取模比较,如果为0,则说明这个数不是质数
②声明一个标志flag,标志这个数是否是质数
三,代码
1,常规的让每个数据一个一个的和其前面的的数(除了1和本身)进行计算,这样时间复杂度O(n^2),耗时比较长,于是要看看能不能优化
public void primeNumTest2(){ long start=System.currentTimeMillis(); boolean flag=true; for(int i=2;i<=100;i++){ for(int j=2;j<i;j++){ if(i%j==0){ flag=false;// 标志不是质数 } } if(flag){ System.out.println(i); } // 再次给flag 进行初始化 flag=true; } }
2,优化一:发现当两个数取模为零符合条件的时候,也就是已经确定该数字不是质数了,程序还会继续进行判断,这样增加了时间的复杂度,因此可以当发现某个数字不是质数的时候就可以终止当前循环.
public void primeNumTest(){ boolean flag=true;// 标志位 // 因为除了1和本身 没有其他的因数 所以初始值从2开始 需要用到嵌套循环,外层控制每个数 内层控制每个因数 for(int i=2;i<100;i++){ for(int j=2;j<i;j++){ if(i%j==0){ flag=false; break;// 跳出当前循环 } } if(flag){ System.out.println(i); } flag=true; } }
3,优化二,通过数学思想发现,每个数与其前面的数(除了1和本身)进行运算的次数还可以进行优化.因为每个数都是由一个小的数字和一个较大的数字相乘而来,所以只要比较了小的数字,较大的数字就不用比
较了,因此比较每个数的前面这个数的平方根个数就可以了
public void primeNumTest(){ boolean flag=true;// 标志位 // 因为除了1和本身 没有其他的因数 所以初始值从2开始 需要用到嵌套循环,外层控制每个数 内层控制每个因数 for(int i=2;i<100;i++){ for(int j=2;j<=Math.sqrt(i);j++){//取平方根 if(i%j==0){ flag=false; break; } } if(flag){ System.out.println(i); } flag=true; } }

浙公网安备 33010602011771号