在C ++中实现相同JS程序的不同

时间:2016-09-04 01:40:01

标签: javascript c++

我最近提出了一个关于在Javascript上实现eratosthenes筛选的问题,以及我得到的工作答案:

function sieve(low, high) {
var primeArray = [], ll = Math.sqrt(high), output = [];

for (var i = 2; i <= high; i++) {
    primeArray[i] = true;
}

for (var i = 2; i <= ll; i++) {
    if (primeArray[i]) {
        for (var j = i * i; j <= high; j += i) {
            primeArray[j] = false;
        }
    }
}

for (var i = 2; i <= ll; i++) {
    if(primeArray[i]) {
        var segmentStart = Math.ceil(low/i) * i;
        // need this test to ensure we are not deleting primes
        if (primeArray[segmentStart]) segmentStart += i; 

        for(var j = segmentStart; j <= high; j+=i) {
            primeArray[j] = false;
        }
    }
}

for(var i = low; i <= high; i++) {
    if(primeArray[i]) {
        output.push(i);
    }
}
return output;
}

console.log(sieve(1, 20));

我尝试在C ++中实现相同的功能 然而,最终结果却截然不同。 我的C ++程序在某种程度上忽略了前2个素数,同时保持1作为素数。

这里是C ++中的相同程序

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

using namespace std;

int main()
{
int low, high;
cout << "Enter lower bound: ";
cin >> low;
cout << "Enter upper bound: ";
cin >> high;

int root = floor(sqrt(high));
int primes[high];

for(int i = 2; i <= high; i++)
{
    primes[i] = true;
}

for (int i = 2; i <= root; i++) {
    if (primes[i]) {
        for (int j = i * i; j <= high; j += i) {
            primes[j] = false;
        }
    }
}

for (int i = 2; i <= root; i++) {
    if(primes[i]) {
        int segmentStart = ceil(low/i) * i;

        if (primes[segmentStart]) segmentStart += i;

        for(int j = segmentStart; j <= high; j+=i) {
            primes[j] = false;
        }
    }
}

for(int i = low; i <= high; i++) {
    if(primes[i]) {
        cout << i;
    }
}

return 0;
}

1 个答案:

答案 0 :(得分:0)

找到了解决方案。

low/i中的int segmentStart = ceil(low/i) * i;除法运算返回一个整数,因此它忽略了结果&lt; 1;

我把我作为双重来解决这个问题:

int segmentStart = ceil(low/(double)i) * i;