2012-10-15 22 views
-2

這是我的代碼,它應該只輸出素數。獲取C和2之間的所有素數

#include <stdio.h> 
int prime(int n){ 
    int j; 
    for (j=2;j<=n/2;j++){ 
     if((n%j)==0){ 
      return 0; 
     } 
     else{ 
      return 1; 
     } 
    } 
} 
void main(){ 
    int i,p; 
    for (i=2;i<=100;i++){ 
     p=prime(i); 
     if(p==1){ 
      printf("%d \n",i); 
     } 
    } 
} 

結果是2,3,7,9,11,13,15 ....

不2,3,5,7,11,13 ....

我做錯了什麼?

+1

我雖然功課標籤已被棄用.. – Krishnabhadra

+5

並在'prime'的'for'環目的是什麼,如果它總是返回它有機會重複過嗎? –

+0

另一種方法來做到這一點,沒有任何餘數,是一個「展開」Eratosthenes篩:http://stackoverflow.com/questions/5200879/printing-prime-numbers-from-1-through-100/12543821#12543821 –

回答

5

你可能想:

int prime(int n){ 
    int j; 
    for (j=2;j<=n/2;j++) 
     if((n%j)==0) 
      return 0; 
    return 1; 
} 
+0

所以有什麼區別? – TTT

+0

您的代碼實際上並沒有循環,因爲它總是在第一次檢查時返回。如果'(n%j)'不等於零,你不想返回,你需要測試其他可能的因素。 –

2

素數,其僅由兩個數整除的數。如2,3,5,7,11等

int main() 
{ 
    int i,j,n=0; 
    for(i=2;i<=100;i++) 
    { 
     for(j=1;j<=i;j++) 
     { 
      if(i%j==0) 
      { 
       n++; 
      } 
     } 
     if(n==2) 
     printf("%d\n",i); 
     n=0; 
    } 
    getch(); 
} 
+1

很奇怪的是,如果一個數字可以被一個數字和它自己整除,那麼你可以通過循環檢查來做額外的工作,只是爲了使額外的工作必須計算因子的數量。另外,沒有稱爲'getch'的C函數。您的程序是無償的平臺特定的嗎?爲什麼要等到鑰匙被擊中呢?這使得某人難以將程序的輸出重定向到文件。 –

1

試試這個:

int prime(int n){ 
    int j; 
    int isPrime = 1; 
    for (j=2;j<=n/2;j++){ 
     if((n%j)==0){ 
      isPrime = 0; 
      break; 
     } 
    } 
    return isPrime; 
} 
0

如果你想找出素數達一定數目(在你的案件2。 .100)建立主表將加快該過程:

注意:重要的是輸入順序幫助建立主表。

#include <stdio.h> 
#include <math.h> 

/* Building a prime table for fast look up 
* NOTE : Numbers should be input from 2 to n in a sequential pattern to help build prime table; */ 

# define PRIME_TAB_MAX 200 

int prime_specific(int num) 
{ 
    static int primeTab[PRIME_TAB_MAX] = { 0, }; 
    static int primeCount = 0; 
    int check_limit ; 
    unsigned int idx; 

    if (num < 2) 
     return 0; 

    if (primeCount > 0) { 
     check_limit = (int)sqrt(num); 
     for (idx = 0; idx < primeCount && primeTab[idx] <= check_limit; idx++) { 
      if (0 == (num % primeTab[idx])) { 
       return 0; 
      } 
     } 
    } 
    else { 
     for (idx = 2; idx <= num/2; idx++) 
      if (0 == (num % idx)) 
       return 0; 
    } 

    if (primeCount < PRIME_TAB_MAX) { 
     primeTab[primeCount++] = num; 
     return 1; 
    } 
    else { 
     fprintf(stderr, "\nERROR: Prime Table is full"); 
     return (-1); //Internal error 
    } 
} 

int main(void) 
{ 
    unsigned int idx; 
    int status ; 

    for (idx = 2; idx <= 1000; idx++) { 

     status = prime_specific(idx); 

     switch (status) 
     { 
     case 1: 
      fprintf(stderr, "%d\n", idx); 
      break; 
     case 0: 
      //Do nothing 
      break; 
     default: 
      fprintf(stderr, "\nERROR:Internal Error"); 
      return (-1); 
     } 
    } 
    return 0; 
} 
-1

代碼:

#include <stdio.h> 

int main() 

{ 

    /* local variable definition */ 

    int i, j; 

    for(i=2; i<100; i++) 
    { 
     for(j=2; j <= (i/j); j++) 

     if(!(i%j)) break; // if factor found, not prime 

     if(j > (i/j)) printf("%d is prime\n", i); 
    } 

    return 0; 

} 
相關問題