Кодовые войны находят идеальный квадрат

#javascript #arrays #loops

Вопрос:

Я знаю, что это обман, но я хочу знать ответ.

Я должен написать функцию, которая принимает нечетное целое число, которое является разницей между двумя последовательными идеальными квадратами, и найти квадраты.

теперь моя проблема в том, что количество идеальных квадратов должно достигать 1 000 000

и система не примет, если для завершения выполнения кода потребуется более 12 мс.

как правильно переписать код, чтобы он мог пройти тест?

    function findSquare(input)
        {
        
        let perfectSquare = []
        let output
        
            for(let i = 0; i <= 1000000; i  ){
                
                perfectSquare = [...perfectSquare, i*i]
            }
            
           for(let x = 0; x < perfectSquare.length; x  ){

               if(perfectSquare[x 1] - perfectSquare[x] === input){

                   output = `${perfectSquare[x 1]}-${perfectSquare[x]}`

                   break
               }
           }

            return output
            
        }

        findSquare(9)
 

результат будет «25-16».

Комментарии:

1. Это вопрос из живого конкурса?

2. нет, только от обычной ката

3. Разницу между последовательными идеальными квадратами довольно просто вывести. Вы можете вычислить ответ напрямую, без поиска.

Ответ №1:

Пусть два числа будут a и b такими-то b = a 1 , и теперь в соответствии с вопросом мы должны найти такое x -то такое-то b * b - a * a = x .

У нас есть

 (b * b) - (a * a) = x

but b = a   1, so replace b by a   1

((a   1) * (a   1)) - (a * a) = x

Now we know that (A   B) * (A   B) = (A * A)   (2 * A * B)   (B * B)

((a   1) * (a   1)) - (a * a) = x

((a * a)   (2 * a * 1)   (1 * 1)) - (a * a) = x

(2 * a)   1 = x

2a   1 = x

a = (x - 1) / 2;  (x is odd (as mentiond in problem), so a is an integer

and b can be found as b = a   1
 

Таким образом, наш требуемый ответ будет (b * b), (a * a)

 function solve(x) {
  let a = (x - 1) / 2;
  let b = a   1;
  console.log(b * b, a * a)
}

solve(9);