Javascript 使用node.js将前100个素数写入文件
我试图自学node.js(没有javascript或真正的编程经验),但在我试图解决的一个问题上遇到了障碍。我的目标是将前100个素数写入txt文件。下面是到目前为止我的代码Javascript 使用node.js将前100个素数写入文件,javascript,node.js,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 =
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);
及
这并没有像我想的那样将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;
}
或直接在浏览器控制台中:
listPrimes( 100 );
(我没有在节点中测试代码,只是在浏览器中测试。)
以下是几个相关的注意事项:
sqrt()
计算被移动到isPrime()
中的循环之外,因此不必为正在测试的每个数字重新计算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;
}
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;
}
函数列表primes(n次){
var素数=[];
对于(变量n=2;n时间>0;n++){
if(isPrime(n,素数)){
素数推(n);
--n时间;
}
}
返回素数;
}
函数isPrime(n,素数){
var max=数学sqrt(n);
对于(var i=0;i
var primes = [2];
--nPrimes
for( var n = 3; nPrimes > 0; n += 2 )
我刚刚完成了创业工程课程作业@Coursera;)的类似代码这是因为您正在尝试学习node.js??您的计划是只在代码生效后缩进代码以节省时间?您永远不会调用primarity
来创建数字数组。arr
仅在函数内部定义。您可能需要fs.writeFileSync(outfile,primarity())
。我建议您阅读。@MESSIAH您是对的,我正在尝试使用几本书来学习node.js,学习codecademy的javascript课程,并学习一门包含上述编程问题的课程。一般来说,我只是在学习编程,并尝试过几种其他语言,但成功率有限。@KDark11,yo你同意Coursera的条款,所以你必须自己做作业:)别当真,我只是开玩笑,我不是分数或证书很重要,但你的知识迈克尔,我很欣赏其中的细节,你对简单代码的想法非常有意义。我正在读另一位用户推荐的章节然后,我会回到我的代码和您建议的代码,以便更好地理解我如何能够更好地编写此代码。感谢您花时间分享您的知识。非常好,我很高兴这对您有用。这就是我们在这里互相帮助的目的。我想对有困难的人说这句话“没有javascript或真正的编程经验”你有了一个很好的开始!@MichaelGeary喜欢优化
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;
}
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;
}
var primes = [2];
--nPrimes
for( var n = 3; nPrimes > 0; n += 2 )