我最近提出了一个关于在 SO 上用 Javascript 实现埃拉托色尼筛法的问题,这是我得到的有效答案:
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;
}
最佳答案
找到解决方案。
low/i
int segmentStart = ceil(low/i) * i;
中的除法运算返回一个整数,因此忽略结果 < 1;
我将 i 类型转换为 double 来解决这个问题,如下所示:
int segmentStart = ceil(low/(double)i) * i;
关于javascript - 同一个JS程序在C++中的不同实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312824/