代码之家  ›  专栏  ›  技术社区  ›  The Winter Soldier

我写了一个程序来打印所有的素数,直到一个给定的a数

  •  3
  • The Winter Soldier  · 技术社区  · 7 年前
    #include<stdio.h>
    
    float abso(float a)
    {
        if(a<0.0)
            return(-1*a);
        else
            return a;
    }
    
    int sqert(int x)
    {
        float x1 = (float)x;
        float g1, g2;
        g1 = x1/2.0;
        g2 = x1/g1;
        double e=0.000000001;
        int sr;
        while(abso(g1-g2)>=e)
        {
            g2 = (g1+x1/g1)/2.0;
            g1 = x1/g2;
        }
        sr = (int)g1;
        return(sr);
    }
    
    int main()
    {
        int num;
        //num = 0;
        printf("Enter a num between 1 and 1000 ");
        scanf("%d",&num);
        //printf("hello");
        int flag;
        flag = 0;
        int i;
        i = 2;
        int m, j;
        m = j = 0;
    
        while(i<=num)
        {
            flag = 1;
            if(i==2)
            {
                printf("%d ",i);
                i++;
            }
            else if(i==3)
            {
                printf("%d ",i);
                i= i+2;
            }
            else if(i>3)
            {
                m = sqert(i);
                for(j=2;j<=m;j++)
                {
                    if((i%j) == 0)
                    {
                        flag = 0;
                        break;
                    }
                }
    
                if(flag == 0)
                {
                    i = i + 2;
                    continue;
                }    
    
                if(j==m+1)
                    printf("%d ",i);
    
                i = i + 2;
            }
        }
        printf("\n");
        return(0);
    }
    

    在这里 sqert 函数取输入值的平方根,绝对函数取给定值的绝对值。

    使用的逻辑很简单,我们迭代到这个数的平方根,然后检查每个数,如果它可以被除它之外的任何其他数整除,那么它不是素数,否则它就是素数。

    但是这个程序只对5的值起作用。在那之后它就什么都不印了。它也不会打印输入的号码。

    任何帮助都将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  1
  •   P.W    7 年前

    在你的代码中,你试图比较 float 具有 double .

    while(abso(g1-g2)>=e)
    

    这是不正确的,因为 浮动 双重的 .

    双重的 精度是 浮动 .

    浮动 是32位IEEE754单精度浮点数
    (符号为1位,指数为8位,数值为23*),
    i、 浮点数有7位小数精度。

    双重的 是64位IEEE754双精度浮点数
    (符号为1位,指数为11位,数值为52*位),
    i、 双精度有15位小数。

    宣布 e 作为 浮动 并确保分配的值符合 浮动 .
    类似于:

    float e = 0.00001;
    

    然后你的代码将按预期工作。

    @埃里克森在评论中说 sqert 函数不一定总是返回正确的近似值。这是正确的。 所以最好用 sqrt math.h 很好地代替了 斯夸特 .

    推荐文章