同一JS程序在c++中的不同实现

Different Implementation of the same JS program in C++

本文关键字:实现 c++ JS 程序 同一      更新时间:2023-10-16

我最近提出了一个关于在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++程序不知何故忽略了前两个素数,而保持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;
}

找到解决办法了

low/iint segmentStart = ceil(low/i) * i;中的除法运算返回一个整数,因此忽略结果<</p> 1;

我将I转换为double类型来解决这个问题,如下所示:

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