gpt4 book ai didi

javascript - 使用 node.js 将前 100 个质数写入文件

转载 作者:搜寻专家 更新时间:2023-10-31 23:28:58 27 4
gpt4 key购买 nike

我正在尝试自学 node.js(没有 javascript 或真正的编程经验),但在我试图解决的一个问题上遇到了障碍。我的目标是将前 100 个质数写入 txt 文件。到目前为止,下面是我的代码。

var fs = require('fs');
var outfile = "test.txt";
var primality = function () {
var arr = [];
for (var n = 2; n <= 542; n++) {
var primeTrue = true;
for (var i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
primeTrue = false;
}
}
if (primeTrue) {
arr.push(n);
}
}
return arr;
}
fs.writeFileSync(outfile, arr);

我正在使用 codecademy javascript 实验室来测试我的循环和条件,这段代码似乎确实有效。 (这也可能不是最好的方法,因为我不得不将我的计数器设置为停止在 542,而不是让程序停止在第 100 个素数)。无论如何,当我添加

var outfile = "test.txt"

fs.writeFileSync(outfile, arr);

这并没有像我想象的那样将100个素数输出到txt文件中。我仍处于学习的初级阶段,因此非常感谢您提供的任何帮助。

提前谢谢你。

凯文

最佳答案

您在一个功能中做了很多事情。如果将代码分解为两个函数,代码可能会更容易理解,一个用于生成素数列表,另一个用于测试特定数字是否为素数:

function listPrimes( nPrimes ) {
var primes = [];
for( var n = 2; nPrimes > 0; n++ ) {
if( isPrime(n) ) {
primes.push( n );
--nPrimes;
}
}
return primes;
}

function isPrime( n ) {
var max = Math.sqrt(n);
for( var i = 2; i <= max; i++ ) {
if( n % i === 0 )
return false;
}
return true;
}

现在您可以在 Node 中运行它了:

var fs = require('fs');
fs.writeFileSync( 'test.txt', listPrimes(100) );

或直接在浏览器控制台中:

listPrimes( 100 );

(我没有在 Node 中测试代码,只在浏览器中测试。)

几个相关的注释:

  1. sqrt() 计算移到了 isPrime() 的循环之外,因此不必为您正在测试的每个数字重新计算。
  2. nPrimes 变量可让您生成所需的素数的确切数量,而无需使用 542 hack。

写完这个简单的版本后,看看可能的优化很有趣。一种是仅检查先前生成的素数的整除性,而不是检查所有整数直到平方根。你可以这样做:

function listPrimes( nPrimes ) {
var primes = [];
for( var n = 2; nPrimes > 0; n++ ) {
if( isPrime( n, primes ) ) {
primes.push( n );
--nPrimes;
}
}
return primes;
}

function isPrime( n, primes ) {
var max = Math.sqrt(n);
for( var i = 0; i < primes.length && primes[i] <= max; i++ ) {
if( n % primes[i] === 0 )
return false;
}
return true;
}

如果生成大量素数,这可能会更快,尽管对于其中的 100 个素数来说,这并不重要,我倾向于坚持使用更简单的代码。

当然,如果您谈论的是优化,那么考虑不同的算法总是值得的。 Sieve of Eratosthenes很有趣,因为它速度快,相当简单易懂。那篇维基百科文章很好地说明了它是如何工作的。在 JavaScript 中,它可能看起来像这样:

function listPrimes( max ) {
// Start with an empty list of primes
var primes = [];
// Initialize the sieve - each number is prime unless proven otherwise
var sieve = new Array( max );
for( var i = 1; i <= max; i++ ) {
sieve[i] = true;
}
// Now check each number from 2 through max
for( var p = 2; p <= max; p++ ) {
if( sieve[p] ) {
// p is prime, save it in the output list
primes.push( p );
// Mark p * 2, p * 3, p * 4, etc. as non-prime
for( var t = p * 2; t <= max; t += p ) {
sieve[t] = false;
}
}
}
return primes;
}

是的,在建议将代码拆分为两个函数之后,我现在回到一个函数。 :-)

Sieve 的一个不同之处在于,您不能真正说“请给我前 N 个素数”;相反,你问它,“请给我所有小于 N 的素数”。但如果 N 很大,它比其他方法快得多。

关于javascript - 使用 node.js 将前 100 个质数写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17382910/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com