【问题标题】:Project Euler #3 Get largest prime factor of a numberProject Euler #3 获得一个数的最大素数
【发布时间】:2014-02-28 10:40:01
【问题描述】:

所以问题如下:

13195的质因数是5、7、13和29。 600851475143这个数的最大质因数是多少?

我为逻辑和算法似乎正确但我似乎找不到错误的问题编写了代码。

#include <iostream>

using namespace std;

int main()
{
    long int x = 600851475143;
    for(long int i=x-1; x%i; --i);
    cout << i;
    return 0;
}

RE:不知道“i”范围,我学校的老师没有告诉我 =) [不怪他们]


RE:感谢您的所有回复,我得到了答案。 =)

【问题讨论】:

  • ...那东西正在编译吗?您在循环中使用的变量在外部不存在,但您尝试打印它。
  • @Riccardo It doesn't compile.
  • 你的程序找到了x的最大因子。为什么应该是素数?可能很好,但没必要。检查x = 8
  • @sparite:如果你得到了答案,那么就这样标记接受的答案。
  • @sparite 你误解了我的意思。在 StackOverflow 上,我们没有用 [已解决] 标签或类似标签标记问题,我们点击答案旁边的“V”,这对我们解决问题有最大帮助。这会将您的问题列为已解决。你不需要提供你想出的最终代码。

标签: c++


【解决方案1】:

有两个小问题和一个大问题:

  • 您的i 变量超出了打印范围 - 语句头中声明的变量范围以语句本身结束。在这种情况下,i 在分号后是不可见的,所以你需要在for 之外声明它
  • 您的变量可能不一定包含您想要放入其中的值 - long 允许为 32 位类型,在许多平台上,它是。要使其至少为 64 位类型,请将声明更改为 long long

一旦你解决了这些问题,你的代码就会被编译。但是,由于您的代码的第三个大问题:您的算法太慢,因此运行需要很长时间。

【讨论】:

    【解决方案2】:

    for 循环之外无法访问i。

    long int i=0;
    for(i= x-1;x%i;--i);
    cout<<i<<endl;
    

    【讨论】:

      【解决方案3】:

      这个呢?只需在 for 之外声明 i

      int main()
      {
        long int x = 600851475143, i;
        for (i = x-1; x%i; --i);
        cout << i;
        return 0;
      }
      

      在您调用cout 时,您的版本中i 不存在。

      int main()
      {
          long int x = 600851475143;    /* here i doesn't exist */
          for(long int i=x-1; x%i; --i) /* here i is declared */ ;
          /* the for is closed by ; so the scope of i is already closed */
          cout<<i;
          return 0;
      }
      

      但是,正如其他答案和 cmets 所指出的,您的解决方案中还存在其他问题。

      【讨论】:

        【解决方案4】:

        还有一个bug:

        如果x 是素数,您将找不到答案。 i 应该从相同的值开始。

        【讨论】:

        • 在这种情况下,它会一直输出x
        • 如果ix 开始,x%i 不会评估为假并结束循环吗?我在这里错过了什么?
        【解决方案5】:

        至少以下代码编译正确,没有溢出问题:

        #include <iostream>
        
        using namespace std;
        
        int main()
        {
            unsigned long long x = 600851475143, i;
         // ^^^^^^^^ Note the unsigned!
            for(i= x-1;x%i;--i);
            cout<<i;
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-01
          • 1970-01-01
          相关资源
          最近更新 更多