#018 C語言刷題 素數問題


今天做題學會了一個求素數的方法

總分 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 之間有無因子即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM