#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);