除了2,3之外的任何质数一定不是2,3的倍数,因此我们可以观察2的倍数和3的倍数之间的一些规律 我们把数字分为|4、5、6|7、8、9|10、11、12|13、14、15|在同一个大小为3的分区内2、3的倍数有 |4、5、6| 2的倍数为4、6 3的倍数为6 |7、8、9| 2的倍数为8、 3的倍数为9 |10、11、12| 2的倍数为10、12 3的倍数为12 |13、14、15| 2的倍数为14 3的倍数为15 由于2、3的最小公倍数为6,故每6个数必然出现一个2和3的共同倍数,我们将其视为3的倍数,上述的结果变为 |4、5、6| 2的倍数为4 3的倍数为6 |7、8、9| 2的倍数为8 3的倍数为9 |10、11、12| 2的倍数为10 3的倍数为12 |13、14、15| 2的倍数为14 3的倍数为15 可以看出当按3位大小分区时,3的倍数一定位于分区的最后一个位置,2的倍数(忽略掉2、3的公倍数)的位置在分区 的第1位和第2位来回交替,呈现出一定规律性,由于质数(>3)一定不是2、和3的倍数,所以其可能出现的位置只能是 分区中除去2、3倍数剩下的位置,第一个这样的数字是5,往后是7、再往后是11、多看几组数我们便可以发现,从5开始, 往后按照2、4、2、4不断交替向前寻找的数一定不是,如何做到2、4交替移动呢,我们可以看出,每移动两次, 移动6个位置,因此当该数 % 6 的余数为1时,前进4,否则前进2即可 static boolean IsPrime(int num) { if(num == 2 || num == 3 || num == 5) return true; if(num <= 1 || (num & 1) == 0 || num % 3 == 0) return false; int i = 5; int bianjie = (int)Math.sqrt(num)+1; while(i <= bianjie && (num % i != 0) ) { i += (i % 6 == 1) ? 4 : 2; } return i > bianjie; }