首页 > 解决方案 > 我写了一个程序来打印所有素数直到给定一个数字

问题描述

#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函数取输入值的平方根,abso 函数取给定值的绝对值。

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

但是这个程序只适用于高达 5 的值。之后它不会打印任何东西。它也不打印输入的数字。

任何帮助,将不胜感激。

标签: cprimes

解决方案


在您的代码中,您试图floatdouble.

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

float这是不正确的,因为和之间的精度不同double

double的精度是 的 2 倍float

float是一个 32 位 IEEE 754 单精度浮点数
(符号 1 位,指数 8 位,值 23*),
即 float 具有 7 个十进制数字的精度。

double是一个 64 位 IEEE 754 双精度浮点数
(符号 1 位,指数 11 位,值 52* 位),
即 double 具有 15 位十进制精度。

声明efloat并确保为其分配了一个符合 精度的值float
就像是:

float e = 0.00001;

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

@EricPostpischil 在评论中说该sqert函数可能并不总是返回正确的近似值。这是对的。所以最好使用sqrtfrom math.hwhich 完美地工作而不是sqert.


推荐阅读