2012-08-08 90 views
-1

我認爲這個代碼下面有全局範圍和局部範圍的問題。如果有人請幫助我,爲什麼這個代碼不工作! 這是一個尋找第25個神奇數字的程序。數字意味着它除了2,3,5之外沒有任何主要因素。我已經從16號開始,這是第12號神奇號碼。然後檢查數字是否可以用7中的任何素數整除,所以我列出全局數組中的素數。並用數組中的素數檢查數字。如果此檢查完成,程序將嘗試使用next_prime函數查找下一個素數,並將它們列入全局數組中。但我得到錯誤的結果。它始終給出不是預期的結果輸入+ = 4。與範圍東西

/*a program to find out 25th magical number. magical number 
means it has no prime factor except 2,3,5*/ 
#include<stdio.h> 
#include<math.h> 
double primes[10000]={2,3,5}; 
int serial=3; 
double next_prime(double f)//function, when called, returns the next prime number 
{ 
    int j=0,loop_breaker=0; 
    int count; 
    while(j==0){ 
     for(count=1;primes[count]<sqrt(f)+1 &&count<serial;count++){ 
      if(fmod(f,primes[count])==0){ 
       f+=2; 
       loop_breaker=1; 
       break; 
      } 
     } 
     if(loop_breaker==0){ 
      primes[serial]=f; 
      serial++; 
      j=1; 
     } 
    } 
    return f; 
} 
int main() 
{ 
    double f=7,prime_divisor,magic_serial=12,magic_number=16; 
    int c,loop_breaker,is_magic; 
    prime_divisor=next_prime(f); 
    f+=2;//this line always comes after the previous line so that everytime the value of f gets changed 
    while(magic_serial!=25){ 
     is_magic=0; 
     loop_breaker=0; 
     for(c=3;c<serial;c++){ 
      if(fmod(magic_number,primes[c])==0){ 
       loop_breaker=1; 
       break; 
      } 
     } 
     if(loop_breaker==0){ 
      while(prime_divisor<sqrt(magic_number)+1){ 
       prime_divisor=next_prime(f); 
       f+=2; 
       if(fmod(magic_number,prime_divisor)==0){ 
        is_magic=1; 
        break; 
       } 
      } 
     } 
     if(is_magic==0){ 
      magic_serial++; 
     } 
     magic_number++; 
    } 
    printf("%lf",magic_number); 
    return 0; 

} 
+0

你對'double f'的期望範圍是什麼? – C2H5OH 2012-08-08 20:33:25

+0

它在主函數 – 2012-08-08 20:35:41

+1

請記住,C數組從索引0開始,而不是索引1 ... – Roddy 2012-08-08 20:43:59

回答

1

我想這個問題是關於next_prime功能, 也許這一個效果更好:

double next_prime() 
{ 
    double f = primes[serial-1] + 2; 
    int count; 
    for(count=1; primes[count]<=sqrt(f) && count<serial; ++count) 
    { 
     if(fmod(f, primes[count])==0) 
     { 
      f += 2; 
      count = 1; 
     } 
    } 
    return primes[serial++] = f; 
} 

我也認爲沒有必要爲函數取一個值,所以我刪除它 也似乎主要功能沒有做你期望的,所以我認爲這一個更好的工作:

int main() 
{ 
    double prime_divisor=next_prime(),magic_serial=12,magic_number=16; 
    int c, loop_breaker; 
    while(magic_serial!=25) 
    { 
     ++magic_number; 
     loop_breaker = 1; 
     while(prime_divisor<magic_number/2) 
      prime_divisor = next_prime(); 
     for(c=3; c<serial; ++c) 
     { 
      if(fmod(magic_number, primes[c])==0) 
      { 
       loop_breaker = 0; 
       break; 
      } 
     } 
     if(loop_breaker) 
      ++magic_serial; 
    } 
    printf("%lf\n",magic_number); 
    return 0; 
} 

我希望這可以幫助。