【问题标题】:Implementing sieve of eratosthenes and then getting highest prime factor [closed]实施 Eratosthenes 筛,然后获得最高素因子 [关闭]
【发布时间】:2013-03-03 21:04:45
【问题描述】:

我一直在试图让筛子工作。当我调试它时,它告诉我像 9 和 15 这样的东西在通过筛子时仍然评估为真。这是什么原因造成的?另外,我是否正确使用向量来获得最高的素数?

#include <iostream>
#include <vector>
#include <math.h>

int main()
{
    long long n = 13195;
        long long sqrtn = sqrt(n);

        bool* boolarray = new bool[n];

        for(long long i = 0; i<=boolarray[sqrtn]; i++) {
                boolarray[i] = true;
        }

        long long x = 0;

        for(long long i=2; i<=sqrtn; i++) {
                if(boolarray[i]) {
                        for(long long j=pow(i, 2)+x*i; j<=n; j=pow(i, 2)+(++x*i))

                                        boolarray[j] = false;
                }
        }

        std::vector<long> primefactors;

        for(long long i = 0; i<=sqrtn; i++)
        {
                if(boolarray[i] && n % boolarray[i] == 0)
                        primefactors.push_back(i);
        }

        int answer = primefactors.back();

        printf("Answer: %i\n", answer);

        _sleep(10000);

        delete[] boolarray;

    return 0;
}

【问题讨论】:

  • 要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,那么您就发现了您的问题。 (然后如果有必要,你应该构造一个minimal test-case。)
  • 我建议你修改你的筛算法,你可以在网上找到很多例子。
  • 这就是我发现筛子不工作的原因。
  • 另请注意,一般来说,这是一种非常低效的查找最大素数因子的方法。
  • 因为筛分到n 是O(n*log log n) 工作并且需要O(n) 空间,但最大的素数通常要小得多。如果你完全分解n,那至多是O(sqrt(n)) 工作并且只需要O(log n) 空间(如果你忘记了较小的素因数,如果你记住了所有素因数,O((log n)²) 是一个上限)。如果最大的素因数相对较小,则工作量要少得多。

标签: c++ math primes sieve-of-eratosthenes sieve


【解决方案1】:

以下是错误的:

                    for(long long j=pow(i, 2)+x*i; j<=n; j=pow(i, 2)+(++x*i))

j 的初始值和更新表达式都不正确。我把它作为一个练习来弄清楚到底是什么问题,以及如何解决它。

【讨论】:

  • 好吧,我再花几个小时绞尽脑汁,我会回复你的。我已经知道这是错误的。
  • 这怎么太本地化了?我勒个去?我只是想要一些帮助。
  • @Tetramputechture 它没有被锁定,所以如果他们愿意的话,仍然有人可以通过 cmets 帮助你(很多人都是这样)但是 SO 不是为了一般调试帮助,而是针对重点问题跨度>
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 2010-09-13
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多