为什么我的printf不起作用?

时间:2015-12-25 04:56:19

标签: c numbers

问题是找到数字600851475143的最大素数因子,我的代码是:

#include <stdio.h>
#include <math.h>
int main()
{
    float i,x;
    float a,y;
    for(a=2;a<=600851475143;a++)
    {
        y=fmod(600851475143,a);
        if(y==0)
        {
            int sum=0;
            for(i=2;i<=a/2;i++)
            {
                if(fmod(a,i)==0)
                {
                    sum=1;
                    break;
                }
            }
            if(sum==0&&a>x)
            x=a;
            // printf("%f\n",x );
        }

    }
    printf("%f\n",x );
    return 0;
}

为什么我的printf功能不起作用?当我把printf放在上面(显示在注释中)时,它可以工作,但最后一个printf不起作用。为什么呢?

2 个答案:

答案 0 :(得分:1)

我不认为printf函数有问题,当你运行程序时,它需要太多时间,所以最后一个printf没有运行,你应该选择另一个更快的算法优化

#include <stdio.h>
#include <math.h>
int main()
{
    float i,x;
    float a,y;
    for(a=2;a<=600851475143;a++) // it needs too much time!
    {
        y=fmod(600851475143,a);
        if(y==0)
        {
            int sum=0;
            for(i=2;i<=a/2;i++)  // this algorithm is O(N^2)
            {
                if(fmod(a,i)==0)
                    {
                        sum=1;
                        break;
                    }
            }
            if(sum==0&&a>x)
            x=a;
            printf("%f\n",x );
        }
    }
    printf("%f\n",x ); // needs too much time to go here
    return 0;
}

答案 1 :(得分:1)

#include <stdio.h>
#include <math.h>
int main()
{
long double i,x, a, y;
    for(a=2;a<=600851475143;a++)
    {
        y=fmod(600851475143,a);
        if(y==0)
        {
            int sum=0;
            for(i=2;i<=a/2;i++)
            {
                if(fmod(a,i)==0)
                    {
                        sum=1;
                        break;
                    }
            }
            if(sum==0&&a>x)
            x=a;
            printf("%Lf\n",x );
            //break;
            }

  }
printf("%Lf\n",x );
return 0;
}

如果没有休息,它会在条件下找到一个数字,但会返回到for并继续寻找另一个。这就是为什么你使用休息来找到第一个。为了找到更多,我建议使用“long double”数据类型。

是一种Real浮点类型,通常映射到扩展精度浮点数格式。实际属性未指定。与float和double类型不同,它可以是80位浮点格式,非IEEE“双倍”或IEEE 754四倍精度浮点格式,如果提供更高精度格式,否则它是相同的双