什么是素数?
素数又称为质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
利用JAVA实现:
思路:
首先输入一个大于一的正整数n;
再根据素数的定义 除了自己本身和1之外没有因数 即从2 到n-1;
利用for循环 从2除到n-1 利用if语句判断 若在此过程中除余为零 则此数不是素数,若除到n-1还没有出现除余为零的情况 则此数为素数;
若要实现循环判断 则使用while(scanner.hasNestInt() ) ;
代码实现:
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
System.out.println("请输入一个大于1的整数:");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()){
int n = scanner.nextInt();//输入一个整数n
int i = 2;//从2开始除
for (;i<n;i++){ //除到n-1结束 i自增到n-1后会再自增一次 i=n循环结束
if (n % i == 0){
System.out.println("不是素数");
break;
}
}//此时i自增到n 即i=n 除到了自己本身 则其一定为素数
if (i==n)
System.out.println("是素数");
}
}
}
这里注意:
for循环中 i=n才会结束循环,所以i到n-1时满足循环条件 会在自增一次到n 才结束循环;
第二个if语句不能写在for循环体内 要等i除到n-1 结束循环之后自增到n;
代码优化:
如果输入的数字更大呢?岂不是要除很多数字?比如10000 就一定要除到9999吗?
我们发现一个数可以表示为n = a*b 例如16 =1x16 2x8 ... 4x4 ..... 8x2 ...................... 16x1;
1 2 3 4 ......... 8 .........................16
数字n找因子 只需找到一半 即n/2
例如 17= 1x17 ....................................................17x1;
找到一半 没有因子 则其后半部分也没有因子 其为素数
实现:
for( ; i <= n/2 ; i++){ // n遍历的范围缩小到 2到n/2
if ( n % i == 0){
System.out.println("不是素数");
break;
}
}
if ( i > n/2){ // 此时遍历到n/2时没有因子 则其为素数
System.out.println("是素数");
}
再次缩小范围 找到根号n
实现:
for( ; i <= Math.sqrt(n) ; i++){ // n遍历的范围缩小到 2到根号n
if ( n % i == 0){
System.out.println("不是素数");
break;
}
}
if ( i > Math.sqrt(n) ){
System.out.println("是素数");
}