C++ 实施埃拉托斯烯的筛选,然后获得最高素因子

C++ 实施埃拉托斯烯的筛选,然后获得最高素因子,c++,math,primes,sieve-of-eratosthenes,sieve,C++,Math,Primes,Sieve Of Eratosthenes,Sieve,我一直在努力使筛子起作用。当我调试它时,它告诉我,像9和15这样的东西在通过筛选时仍然是正确的。这是什么原因?另外,我是否正确地使用向量来获得最高的素数因子 #include <iostream> #include <vector> #include <math.h> int main() { long long n = 13195; long long sqrtn = sqrt(n); bool* boolarra

我一直在努力使筛子起作用。当我调试它时,它告诉我,像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;
}

以下是错误的:

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

j的初始值和更新表达式都不正确。我把它作为一个练习,来找出到底是什么错误,以及如何修复它。

让人们发现代码中的错误并不是特别有效。您应该使用调试器或添加打印语句来隔离问题,方法是跟踪程序的进度,并将其与预期发生的情况进行比较。一旦这两个问题出现分歧,你就发现了问题所在。如果有必要的话,你应该构建一个。我建议你修改你的筛选算法,你可以在网上找到很多例子。这就是我发现筛选不起作用的原因。还要注意的是,这是一种非常低效的方法来寻找最大的素数因子。因为筛选到n是在*log n上工作,需要在空间上工作,但最大的主要因素通常要小得多。如果你完全分解n,那最多是Osqrtn工作,如果你忘记了较小的素数因子,只需要Olog n空间,如果你记住了所有素数因子,Olog n²是一个上界。如果最大的主因子相对较小,那么工作量就会小得多。好吧,我再花几个小时绞尽脑汁,然后再给你回复。我已经知道这是错误的。这怎么太本地化了?我勒个去?我只是想得到一些帮助。@Tetracomputer它没有被锁定,所以如果有人愿意,他们仍然可以通过评论来帮助你,而且很多人都是这样帮助你的,但这不是一般的调试帮助,而是针对有重点的问题