2011-06-22 43 views
0

在從@neal AISE here to get prime factors答案: 我所做的:問題主要算法用C

/*neal aise's code*/ 
printPrimeFactors(int num) { 
    int i; 
    for (i = 2; i < sqrt(num); i=next_prime(i)) { 
    if (num %i){ 
     printf("%d", i); 
    } 
    } 
} 

/*my code*/ 
int next_prime(int p){ 
    int prime_found = 0; 
    while (!prime_found){ 
    if (p <= 1)/* if low number comes in, then */ 
     p = 2; /* next prime is always 2 (first prime) */ 
    else 
      if ((p % 2) == 0) /* no even primes */ 
       p++;  /* make the number odd before test */ 
      else 
       p += 2;  /* get next odd numero to test */ 
    prime_found = is_prime(p); /*check if number is prime*/ 
    } 
    return (p); 
} 


int is_prime(int p){ 
    int curr_num = 2;     /* start divisor at 2 */ 
    float stop_num = sqrt((float) p); /* no divisor > sqrt of number needed */  
    while(curr_num <= stop_num){ 
     if ((p % curr_num) == 0)  /* not prime if evenly divisible */ 
      return (0); 
     else 
      curr_num++;    /* increment divisor */ 
    } 
    return(1);       /* not evenly divisible, return prime */ 
} 

如何moddify的代碼功能

printPrimeFactors()

所以它按需運作?

+0

嘗試在代碼中添加一些'cout <<'語句。他們總是幫助我調試這樣的事情。 – Blender

+0

你的'is_prime()'函數做了什麼? – bdares

+0

你可以發佈你的'is_prime()'代碼嗎?此外,輸入/輸出代碼... – Jon

回答

1

如果你想「素數生成器」,接口是確定了我。但是你的代碼限制了素數的數量。

無意義的接口是沒有價值的。它可以寫得更簡單。

#include <stdio.h> 

int main() { 
    int n, m; 
    for (n = 1; n < 1000 /* specify your max */; n++) { 
    for (m = n-1; m > 1; m--) 
     if (n % m == 0) break; 
    if (m == 1) 
     printf("%d\n", n); 
    } 
    return 0; 
} 
+0

和主要因素呢?,你看到代碼可行嗎? – cMinor

1

有幾個邏輯錯誤:

if (num%i) // Change this to... 
if ((num%i)==0) // num%i == 0 when i divides num, this 'i' is a prime factor. 

而且,你將只能通過<sqrt(num)停止打印出大約一半的素因子。要麼改變的退出條件for循環是i <= num

for (i = 2; i <= num; i=next_prime(i)) { // note the <= 
    if (num %i){ 
    printf("%d ", i); 
    } 
} 

或者可替換地,更有效的方法。需要注意的因素不會是爲了:

for (i = 2; i <= sqrt(num); i=next_prime(i)) { 
    if (num %i){ 
    printf("%d %d ", i, num/i); // Print out the pair, since we stop at i<=sqrt(num) 
    } 
} 
0

而不是X =開方(n_limit),如果(N < X),你可以不喜歡它,如果(N * N < n_limit)。不需要昂貴的sqrt(),浮動或者強制轉換。