今天做題學會了一個求素數的方法
總分 | 13 |
孿生素數 相差為2的兩個素數稱為孿生素數。例如,3與5,41與43等都是孿生素數。設計程序求出指定區間上的所有孿生素數對。區間上限和下限由鍵盤獲取。 程序運行示例如下: please input c,d(c>2): 10,200↙ (11,13) (17,19) (29,31) (41,43) (59,61) (71,73) (101,103) (107,109) (137,139) (149,151) (179,181) (191,193) (197,199) total=13 輸入格式: 區間上限和下限的輸入格式: "%ld,%ld" 輸出格式: 區間上限和下限的輸入提示信息:"please input c,d(c>2):\n" 孿生素數的輸出格式:"(%ld,%ld)\n" 所有孿生素數對的總數輸出格式: "total=%d\n"
1 #include<stdio.h> 2 #define q 1000011 3 int a[q]; 4 int main() 5 { 6 printf("please input c,d(c>2):\n"); 7 int i; 8 int j; 9 a[1]=a[0]=1; 10 for(i=2;i<q;i++) 11 { 12 if(!a[i]) 13 { 14 for(j=2*i;j<q;j+=i) 15 a[j]=1; 16 } 17 } 18 int m,n; 19 scanf("%d,%d",&n,&m); 20 int x=n; 21 int y=m; 22 23 24 int z; 25 z=0; 26 if(m<=2) 27 printf("0\n"); 28 else 29 {for(i=x+2;i<=y;i++) 30 { 31 if(!a[i]&&!a[i-2])//判斷距離是否為2; 32 {printf("(%ld,%ld)\n",i-2,i); 33 z++; 34 } 35 36 } 37 printf("total=%d\n",z); 38 39 } 40 41 }
#define q 1000011 int a[q]; a[1]=a[0]=1; for(i=2;i<q;i++) { if(!a[i]) { for(j=2*i;j<q;j+=i) a[j]=1; } }
從2開始把每個數的倍數下標的數組設置成值為1
這樣一輪循環下來值為0的數組元素,下標值就是素數.
Get到了這個神奇的點,敲起來很快
我原來的做法是這種
1 public static boolean isPrime(int n){ 2 if (n <= 3) { 3 return n > 1; 4 } 5 for(int i = 2; i < n; i++){ 6 if (n % i == 0) { 7 return false; 8 } 9 } 10 return true;
1 public static boolean isPrime(int n) { 2 if (n <= 3) { 3 return n > 1; 4 } 5 int sqrt = (int)Math.sqrt(n); 6 for (int i = 2; i <= sqrt; i++) { 7 if(n % i == 0) { 8 return false; 9 } 10 } 11 return true;
1 public static boolean isPrime(int num) { 2 if (num <= 3) { 3 return num > 1; 4 } 5 // 不在6的倍數兩側的一定不是質數 6 if (num % 6 != 1 && num % 6 != 5) { 7 return false; 8 } 9 int sqrt = (int) Math.sqrt(num); 10 for (int i = 5; i <= sqrt; i += 6) { 11 if (num % i == 0 || num % (i + 2) == 0) { 12 return false; 13 } 14 } 15 return true; 16 }
C語言判斷素數(求素數)(兩種方法)
素數又稱質數。所謂素數是指除了 1 和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被 2~16 的任一整數整除。
思路1):因此判斷一個整數m是否是素數,只需把 m 被 2 ~ m-1 之間的每一個整數去除,如果都不能被整除,那么 m 就是一個素數。
思路2):另外判斷方法還可以簡化。m 不必被 2 ~ m-1 之間的每一個整數去除,只需被 2 ~之間的每一個整數去除就可以了。如果 m 不能被 2 ~
間任一整數整除,m 必定是素數。例如判別 17 是是否為素數,只需使 17 被 2~4 之間的每一個整數去除,由於都不能整除,可以判定 17 是素數。
原因:因為如果 m 能被 2 ~ m-1 之間任一整數整除,其二個因子必定有一個小於或等於,另一個大於或等於
。例如 16 能被 2、4、8 整除,16=2*8,2 小於 4,8 大於 4,16=4*4,4=√16,因此只需判定在 2~4 之間有無因子即可。