import java.util.ArrayList; import java.util.Scanner; public class PrimeNumber { /** * ********************************************************************* * 只有1和它本身两个正因数的自然数,叫质数(Prime Number)。 * (如:由2÷1=2,2÷2=1,可知2的因数只有1和它本身2这两个约数,所以2就是质数。 * 与之相对立的是合数:“除了1和它本身两个因数外,还有其它因数的数,叫合数。” * 如:4÷1=4,4÷2=2,4÷4=1,很显然,4的因数除了1和它本身4这两个因数以外,还有因数2,所以4是合数。) * 100以内的质数有2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71, * 73,79,83,89,97,在100内共有25个质数。 * 注:(1)2和3是所有素数中唯一两个连着的数。 * (2)2是唯一一个为偶数(双数)的质数。[1] * 质数的平方数只有三个因数. * ******************************************************************** * @param args * 题目:判断101-200之间有多少个素数,并输出所有素数。 */ public static void main(String[] args) { // TODO Auto-generated method stub //根据输入的两个数,输出两数之间的全部素数 int start = 0, end = 0; Scanner input = new Scanner(System.in); System.out.println(" 请输入大于1的两个数区间 "); while(start <= 1 || end <= 1){ try{ start = input.nextInt(); end = input.nextInt(); }catch(Exception e){} } input.close(); ArrayList list = new ArrayList();//保存判断出来的素数 for(int i = start; i <= end; i++){ if(isPrime(i)){ list.add(i); } } System.out.println(start + " 到 " + end + " 之间的素数是 " + list + "\n总数是 " + list.size()); } /** * * @param int number * @return boolean (true is prime number, false is not prime number); */ private static boolean isPrime(int i){ int k = (int) Math.sqrt(i); if (i < 3 && i > 0) return true;//2、3是唯一连续的两个素数 for (int j = 2; j < i/2+1; j++){ if(i%j == 0) //如果余数为0,表示被1和自己之外的数整除了,即非素数,属于合数 return false; } return true; } }
根据素数定义,判断一下,除了1和本身之外的数字,只要不能把本身整除,那么证明这个数字就是素数了。
因此想要从1到数字本身一次判断余数是否为0,
然后又想,当循环超过数字本身一半之后就已经不可能在有整除的情况出现了,因此,循环可以减少一些,控制条件改正 本身除以2
但是对于4这样的小数的时候有问题,因此修改为 本身/2+1,这样可以了。
看到很多地方使用的是 Math.sqrt(本身); 表示不明所以。