2012-08-08 53 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; 
} 

我希望这可以帮助。