【发布时间】: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