【问题标题】:Why my printf does not work?为什么我的 printf 不起作用?
【发布时间】:2023-03-16 07:58:01
【问题描述】:

问题是求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 放在上面(以 cmets 显示)时,它可以工作,但最后一个 printf 不起作用。为什么?

【问题讨论】:

  • 先尝试初始化x=0,然后检查是否打印
  • 您的数字不会以足够的精度表示为浮点数。需要 double 或 long long。
  • 还是不行
  • 但它在注释的 printf 中工作
  • 600,851,475,143 是一个巨大的数字,您的循环不会在超级计算机上完成。这就是为什么您看不到最后一个 printf 的原因,因为程序仍在循环中。如果 'a' 在此之前没有溢出,那么 ti 永远不会完成。

标签: c numbers


【解决方案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;
}

【讨论】:

    【解决方案2】:
    #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 四精度浮点格式(如果提供了更高的精度格式),否则与双倍。

    【讨论】:

    • 但是如果有中断我们无法找到最大值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2022-12-18
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多