Kev*_*ark 3 javascript node.js
我正在尝试自学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);
Run Code Online (Sandbox Code Playgroud)
我正在使用codecademy javascript实验室来测试我的循环和条件,这段代码似乎确实有效.(这也可能不是最好的方法,因为我必须设置我的计数器停在542而不是让程序停在第100个素数).无论如何,当我加入时
var outfile = "test.txt"
Run Code Online (Sandbox Code Playgroud)
和
fs.writeFileSync(outfile, arr);
Run Code Online (Sandbox Code Playgroud)
这并没有像我想象的那样将100个素数输出到txt文件.我仍然在学习的基础上,所以我非常感谢您提供的任何帮助.
先感谢您.
凯文
Mic*_*ary 10
你在一个功能中做了很多.如果将代码分解为两个函数,一个用于制作素数列表,另一个用于测试特定数字是否为素数,则代码可能更容易理解:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在您可以在Node中运行它:
var fs = require('fs');
fs.writeFileSync( 'test.txt', listPrimes(100) );
Run Code Online (Sandbox Code Playgroud)
或直接在浏览器控制台中:
listPrimes( 100 );
Run Code Online (Sandbox Code Playgroud)
(我没有在Node中测试代码,只在浏览器中测试.)
几个相关的说明:
sqrt()计算在移动外循环isPrime(),所以它不必重新计算每个你正在测试数.nPrimes变量可让您生成所需的素数而无需542黑客.写完这个简单的版本后,看看可能的优化很有意思.一种是仅检查先前生成的素数的可除性,而不是检查直到平方根的所有整数.你可以这样做:
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;
}
Run Code Online (Sandbox Code Playgroud)
如果你生成大量素数,这可能会更快,虽然其中100个几乎不重要,我倾向于坚持使用更简单的代码.
当然,如果你在谈论优化,那么总是值得考虑不同的算法.Eratosthenes的Sieve是一个有趣的,因为它快速,相当简单,易于理解.维基百科的文章很好地说明了它的工作原理.在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;
}
Run Code Online (Sandbox Code Playgroud)
是的,在建议将代码分成两个函数之后,我现在回到一个函数.:-)
Sieve的一个不同之处在于你无法真正说出"请给我第一批N素数"; 相反,你问它,"请给我所有低于N的素数".但如果N是一个很大的数字,它比其他方法快得多.
| 归档时间: |
|
| 查看次数: |
9263 次 |
| 最近记录: |