2015-02-11 44 views
1

我一直在研究這個程序來計算兩個值之間有多少個孿生素數,並且已經指定孿生素數以(6n-1,6n + 1)格式出現, (3,5)的例外。我的代碼似乎工作正常,但它不斷給我錯誤的結果.... 1少孿生素數比我應該得到的。在1到40之間,我們應該有5個孿生素數,但我總是得到4.é2個值之間的雙引號錯誤的結果

我在做什麼錯了?我沒有考慮到(3,5)?

這裏是我的代碼:

#include <stdio.h> 

int prime (int num) { 
    int div; 
    if (num == 2) return 1; 
    if (num % 2 == 0) return 0; 
    div = 3; 
    while (div*div <= num && num%div != 0) 
     div = div + 2; 
    if (num%div == 0) 
     return 0; 
    else 
     return 1; 
} 

int main(void) { 
    int low, high, i, count, n, m; 
    printf("Please enter the values for the lower and upper limits of the interval\n"); 
    scanf("%d%d", &low, &high); 
    printf("THIS IS THE LOW %d\n AND THIS IS THE HIGH %d\n", low, high); 
    i = low; 
    count = 0; 
    while (6*i-1>=low && 6*i+1<=high) { 
     n = 6*i-1; 
     m = 6*i+1; 
     if (prime(n) && prime(m)) ++count; 
     i = i + 1; 
    } 
    printf("Number of twin primes is %d\n", count); 
    return 0; 
} 

回答

1

你的程序失誤(3.5),因爲3沒有被限制爲一個素數,因爲4不是6的倍數,而不是主循環步進(有效)6,由1

#include <stdio.h> 

int prime (int num) { 
    int div; 
    if (num == 1) return 0;    // excluded 1 
    if (num == 2 || num == 3) return 1; // included 3 too 
    if (num % 2 == 0) return 0; 
    div = 3; 
    while (div*div <= num) { 
     if (num % div == 0)    // moved to within loop 
      return 0;  
     div += 2; 
    } 
    return 1; 
} 

int main(void) { 
    int low, high, i, count, n, m; 
    printf("Please enter the values for the lower and upper limits of the interval\n"); 
    scanf("%d%d", &low, &high); 
    printf("THIS IS THE LOW %d\n AND THIS IS THE HIGH %d\n", low, high); 
    count = 0; 
    for (i=low; i<=high; i++) { 
     n = i-1; 
     m = i+1; 
     if (prime(n) && prime(m)) { 
      printf ("%2d %2d\n", n, m); 
      ++count; 
     } 
    } 
    printf("Number of twin primes is %d\n", count); 
    return 0; 
} 

程序輸出

1 
40 
THIS IS THE LOW 1 
AND THIS IS THE HIGH 40 
3 5 
5 7 
11 13 
17 19 
29 31 
Number of twin primes is 5 

下運行這個答案的步驟:

3 
10 
THIS IS THE LOW 3 
AND THIS IS THE HIGH 10 
3 5 
5 7 
Number of twin primes is 2 
+0

它完美地對於像圖1和40的間隔和工作的,但不能用於3 10之間3和10中,我應該有2,而不是1雙..但這不是我得到的輸出。 – 2015-02-11 20:31:35

+0

輸入3和10,給出兩對(3,5)和(5,7)。 – 2015-02-11 20:34:33

0

https://primes.utm.edu/lists/small/100ktwins.txt

在四十五個孿生素數是(3,5),(5,7),(11,13),(17,19),(29,31),所以如果你知道你的代碼沒有計算(3,5),那麼它正常工作,計數(5,7),(11,13),(17,19)和(29,31)。

可能的解決方法是添加if語句,如果起始數字小於4,則將「count」加1。我不是真的習慣於讀C語法,所以我很難讓我的頭部你的配方,對不起。

編輯:因爲意見不格式化代碼片段:

i = low; count = 0; if (low <= 3 && high >= 3){ count ++; // accounts for (3,5) twin primes if the range includes 3 }

+0

我試着添加一個if語句來計算起始數字是否小於4,小於或等於5並等於3.它適用於當我有以1開頭的間隔時,比如1和10,1和100以及1和1000000,但是當我嘗試像3到10之間的間隔時,它仍然比它應該少一個孿生。 – 2015-02-11 20:15:40

+0

我在while循環之前添加的語句如下: if(low <= 5)count = 1; – 2015-02-11 20:17:29

+0

好吧,所以它肯定與(3,5)和(5,7)之間的獨特距離有關。該公式不能解釋它,因此如果您輸入的範圍包含三個,則必須手動對其進行計數。我插入了下面的if語句並且它能正常工作: 'i = low; count = 0; if(low <= 3 && high> = 3)count ++; //如果範圍包括3 }則佔(3,5)孿生素數} – markedwardmurray 2015-02-11 20:43:36

0

您的主要功能有問題,這是你的主要功能爲前十個主要評價輸出

for(i=1;i<=10;i++) printf("%d\t%d",i,prime(i)); 

1  1 
2  1 
3  0 
4  0 
5  1 
6  0 
7  1 
8  0 

請注意Weather Vane的prime()函數,您應該包含3作爲素數(並排除1)。


從[1],孿生素數是那些有兩個主要缺口,與另一個主要素相差兩個。 (3,5),(5,7),(11,13)。實例是(3,5),(5,7),(11,13)。正如你所述,格式(6n-1,6n + 1)是正確的,但對於(3,5)。您的程序幾乎可以正常運行,因爲它顯示了間隔內的孿生素數,並遵循上述規則。這不包括(3,5)。你可以做出一種例外(例如,如果低< = 3加1到總數),或使用另一種算法來計算孿生素數(如驗證我是否是素數,然後計算從我到下一個素數的距離,如果距離= 2然後它們是孿生素數)

[1] http://en.wikipedia.org/wiki/Twin_prime