Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用node.js将前100个素数写入文件_Javascript_Node.js - Fatal编程技术网

Javascript 使用node.js将前100个素数写入文件

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 =

我试图自学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);

这并没有像我想的那样将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 )