有范围的东西

时间:2012-08-08 20:29:15

标签: c scope

我认为以下此代码中的全局范围和本地范围存在一些问题。如果有人请帮助我,为什么这个代码不起作用!! 这是一个找到第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;

}

1 个答案:

答案 0 :(得分: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;
}

我希望这会有所帮助。