在简单的数学运算中崩溃到桌面

时间:2014-06-11 14:24:28

标签: c++

警告:项目欧拉的扰流器问题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;任务中,但这会让我感到惊讶。)

知道可能出现什么问题吗?

3 个答案:

答案 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