使用node.js将前100个素数写入文件
Writing first 100 prime numbers to a file using 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);
我使用codecademyjavascript实验室来测试我的循环和条件,这段代码似乎确实有效。(这也可能不是最好的方法,因为我必须将计数器设置为停止在542,而不是让程序停止在第100个素数)。无论如何,当我添加时
var outfile = "test.txt"
和
fs.writeFileSync(outfile, arr);
这并没有像我想象的那样将100个素数输出到txt文件中。我还在学习,所以我非常感谢你能提供的任何帮助。
提前谢谢。
Kevin
您在一个函数中做了很多工作。如果你把代码分成两个函数,一个用来列出素数,另一个用来测试特定数字是否素数,那么代码可能会更容易理解:
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中测试代码,只是在浏览器中测试。)
几个相关的注意事项:
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;
}
如果你生成大量素数,这可能会更快,尽管对于其中的100个素数来说,这并不重要,我倾向于使用更简单的代码。
当然,如果你在谈论优化,那么总是值得考虑不同的算法。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;
}
是的,在建议将代码拆分为两个函数之后,我现在回到一个函数。:-)
关于筛的一个区别是,你不能真的说"请给我前N个素数";相反,你问它,"请给我所有小于N的素数"。但是,如果N是一个大数字,它比其他方法快得多。
如果您预先初始化列表并跳过测试2 的倍数的素性,则效果更佳
var primes = [2];
--nPrimes
for( var n = 3; nPrimes > 0; n += 2 )
我刚刚完成了创业工程课程作业中非常相似的代码@Coursera;)
- 最好有一个大画布还是最多 100 个动态生成的小画布
- 如何javascript验证<输入类型=文件多个>如果浏览器不支持多个
- 使用Ajax和Jquery一次加载100个块的Wordpress帖子
- 截断段落的前100个字符并隐藏段落的其余内容,以显示/隐藏更多/更少链接的其余内容
- 如何在Google表格中获取超过100个用户名的Twitter关注者数量
- 如何存储最近访问过我网站的 100 个 IP 地址
- 将输入文件(多个文件)保存到数组 var js,jquery 中
- 输入类型=文件多个,删除项目
- 如何在 JavaScript 中管理 100 个 else if 语句?更好的方法
- 使用 angularJS 加载 100 个用户的数据以及 DOM 修改
- 在 ajax call-JavaScript 中返回的 100 个项目的限制
- 数组中 100 个 1 - 20 范围内的随机数
- Dojo构建没有't包括dojo/dom、dom/when、dojo/dom-class和大约100个其他模块
- 我有一个由100个具有类别和子类别属性的对象组成的数组,需要创建一个新的子类别计数数组
- 如何忽略文件是个难题
- 在页面加载时请求多达100个ajax请求是不是一种糟糕的做法
- 生成100个随机数,并将它们全部显示在面板中
- Javascript:每100个区块文本运行一个Regex匹配函数
- 使用node.js将前100个素数写入文件
- node.js/读取文件的前100个字节