Неверный JavaScript Результат для задачи проекта Эйлера - PullRequest
0 голосов
/ 13 апреля 2020

Рассмотрим все целочисленные комбинации a b для 2 ≤ a ≤ 5 и 2 ≤ b ≤ 5:

2 2 = 4, 2 3 = 8, 2 4 = 16, 2 5 = 32
3 2 = 9, 3 3 = 27, 3 4 = 81, 3 5 = 243
4 2 = 16, 4 3 = 64, 4 4 = 256, 4 5 = 1024
5 2 = 25, 5 3 = 125, 5 4 = 625, 5 5 = 3125

Если они затем расположены в числовом порядке, с удаленными повторениями, мы получаем следующую последовательность из 15 различных терминов:

4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

Сколько различных терминов в последовательности, сгенерированных a b для 2 ≤ a ≤ 100 и 2 ≤ b ≤ 100?

https://projecteuler.net/problem=29

var numberarray =[];
var numberr;

for(var a = 1; a++ <101;){
    for (var b =1; b++<101;){
        numberr = a ** b
        isexist = numberarray.includes(numberr)
        if(isexist == false){
            numberarray.push(numberr)
        }
    }
}

console.log(numberarray.length);

вот моя проблема, ответ - 9183, но мое решение говорит, что ответ - 9382. где проблема.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

В вашем источнике 2 проблемы.

  1. Ваш l oop довольно странный. Эта строка:
for(var a = 1; a++ <101;){

вызовет al oop с номерами 2, 3 до 101. Таким образом, он начинается с 2 и заканчивается на 101.

Это может быть исправлено так:

for(var a = 1; ++a <101;){

(спасибо Dickens AS), но более разумный способ написать это:

for(var a = 2; a<101; a++){

Вторая проблема:

Javascript имеет (для своего обычного number типа) ограничение на то, какие цифры можно безопасно представить. Это также называется Number.MAX_SAFE_INTEGER или 9007199254740991.

Числа выше этого теряют точность. Вы больше не получаете точные результаты.

Это означает, что если у вас есть 2 вычисления, которые обычно дают один и тот же результат, например:

a ** b === c ** d

Это , а не всегда верно в Javascript, потому что математика с большим числом может получить неточные результаты. Так что это действительно вариант «не делайте точных сравнений с математикой с плавающей запятой».

Против духа проекта euler вручать вам ответ, поэтому я не буду его записывать. Если вы действительно хотите, вы можете найти его в любом случае. Однако я проверил это, сделав 2 корректировки, и получил ровно 9183.

Другое редактирование: Оказывается, что для некоторых людей с Chrome вы получаете правильные ответы, даже не решая проблему большого числа. Важно отметить, что это ненадежно, хотя. Непонимание этой проблемы, вероятно, вызовет у вас головную боль в последующих проблемах Эйлера. (Спасибо ВЛАЗ)

0 голосов
/ 13 апреля 2020

приращение правой руки отличается от левой руки

Ваш l oop включает 101, что является проблемой

Попробуйте этот код

var numberarray = [];
var numberr;

for (var a = 1; ++a < 101;) {
  for (var b = 1; ++b < 101;) {
    var numberr = a ** b;
    isexist = numberarray.includes(numberr)
    if (isexist == false) {
      console.log(numberr)
      numberarray.push(numberr)
    }
  }
}

console.log(numberarray.length);

Выход:

9183
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...