JavaScript для проблем проекта Эйлера

Я пытаюсь решить Q10 из Project Euler. Я использую JavaScript и алгоритм решета Аткинса для решения проблемы. Когда я запускаю код в браузерах (Safari и FF), браузеры запрашивают, что script не отвечает. Даже если я позволю script продолжить, я не получил ответа. Я знаю, что есть темы для одной и той же проблемы Project Euler.

Мои вопросы будут: -

1.Как далеко JavaScript способен решать такие сложные математические задачи для браузеров?

2. Есть ли какая-либо другая среда, где я могу проверить свои программы JavaScript?

Спасибо всем.

Ответ 1

  • Я бы подумал так же хорошо, как и любой другой. В последние годы реализация JavaScript была оптимизирована благодаря увеличению использования в Интернете.

  • Вы можете использовать node.js или CScript (версия командной строки хоста Windows Script - это поставляется как часть Windows).

Если я помню, что моя реализация этого вопроса (на Python) была значительно медленнее, чем я думал, это будет. Вероятность медленности связана с вашим алгоритмом, а не с языком.

Ответ 2

Цель проекта Эйлера - заставить вас думать математически. Подумайте о жестоком принуждении, и вы застрянете. Вот реализация Сито Эратосфена


function problem10() {

    var i, j, k, l = Math.floor((2000000-1)/2), a = [];
    for (i = 0; i < l; i++) {
        a[i] = true;
    } var m = Math.sqrt(2000000);
    for (i = 0; i <= m; i++) {
        if (a[i]) {
            j = 2 * i + 3;
            k = i + j;
            while (k < l) {
                a[k] = false;
                k += j;
            }
        }
    } var s = 2;
    for (i = 0; i < l; i++) {
        if (a[i]) {
            s += 2 * i + 3;
        }
    }
    return s;

}

var d1 = new Date().getTime();
var answer = problem10();
var d2 = new Date().getTime();

console.log('Answer:' + answer + ' time:' + (d2 - d1));

Вы можете запустить его на консоли разработчика Chrome (Ctrl + Shift + J). И угадайте, что, часы на 0,1 секунды.

Ответ 3

function problem10(){

    var a = 0;

    function isPrime(n){
        var i = 2;
        var b = true;
        while(i<=Math.sqrt(n) && b){
            b = n%i===0?false:true;
            i++;
        }
        return n<2?false:b;
    }

    for(i=0;i<2000000;i++){
        if(isPrime(i)){
            a+=i;
        }
    }
    return a;

}

Ответ 4

Вы можете попробовать протестировать свою реализацию на node.js.

Однако я бы поспорил, что у вас проблемы с вашим кодом. JavaScript в современном браузере довольно быстр (и, как правило, вы должны получить ответы Project Euler очень быстро, он не предназначен для больших вычислительных мощностей).