警告:项目欧拉的扰流器问题nr。 3
我的代码崩溃到桌面,没有可用的调试器。为了帮助查明问题,我抛出了一些std :: cout语句并重新编译。
代码:
/*The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?*/
#include <iostream>
#include <vector>
#include <cmath>
int main(){
const long long target = 600851475143;
double squareRootOfTarget = sqrt(target);
long longSquareRootOfTarget = floor(squareRootOfTarget+1);
std::vector<long> primes;
primes.push_back(2);
bool test = 0;
for( long i = 3; i < longSquareRootOfTarget; i++){
std::cout << "\n\nTesting: " << i << " -";
for( int j = 0; j<(primes.size()+1); j++){
std::cout << " " << j;
if (0 == i%primes[j])
{
test = 1;
}
std::cout << " " << j;
}
std:: cout << "\n Finished testing " << i;
if (0 == test) {
primes.push_back(i);
std::cout << "\n" << primes.back() << " is a prime.";
}
test = 0;
}
return 0;
}
问题:在迭代i = 23时,它打印出预期的:
Testing: 23 - 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8
Finished testing 23
23 is a prime.
然后,在i = 24的迭代中,它突然失败了:
Testing: 24 - 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9
*crash*
这可能意味着错误在条件if (0 == i%primes[j])
中,它应该扩展为简单if (0 == 24%23)
并评估为false但显然不会发生。 (当然,这也可能发生在test = 1;
任务中,但这会让我感到惊讶。)
知道可能出现什么问题吗?
答案 0 :(得分:1)
我不这么认为:
j<(primes.size()+1)
然后这个:
primes[j]
是个好主意;使用j<primes.size()
答案 1 :(得分:1)
修正了它。
for( int j = 0; j<(primes.size()+1); j++){
应改为
for( int j = 0; j<(primes.size()); j++){
你用+ 1溢出了矢量。这会导致未定义的行为,per the spec
答案 2 :(得分:1)
如果没有调试器,我的猜测是当j = 9时你在素数[j]上进行SEGFAULTing。尝试在primes.size()上删除+1。 23是第9个素数,它是索引8。 2,3,5,7,11,13,17,19,23。
HTH