Как получить цифры от BigInt в JavaScript? - PullRequest
3 голосов
/ 09 марта 2019

Я работаю над проблемой № 104 проекта Euler Задача 104 и хотел бы сделать это в javascript.

Чтобы решить эту проблему, мне нужно вычислить большие значения последовательности Фибоначчи, но числа, производимые этой последовательностью, слишком велики, чтобы их можно было обрабатывать классическим числом, поэтому я использую BigInt, поддерживаемый в последних версиях javascript .

Как только у меня есть определенный результат, сохраненный в BigInt, мне нужно проверить его первые 10 и последние цифры.


Чтобы получить цифры из числа, мы обычно делаем что-то вроде приведенного ниже кода, но когда число становится очень большим, все идет не так:

let number = BigInt(123456789)
console.log(number.toString())
console.log(number.toString()[3]) // Result is fine

let bigNumber = BigInt(1234567891111111111111111111111111111)
console.log(bigNumber.toString())
console.log(bigNumber.toString()[30]) // unpredictable result

Кажется, что методы "toString ()" используют только точность типа Number (я полагаю, 2 ^ 53), поэтому мы быстро теряем точность в отношении последних цифр числа BigInt. Проблема в том, что я не могу найти другие способы извлечь эти цифры.

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

Вычислить Фибоначчи (500) = 280571172992510140037611932413038677189525

Получите 10 последних цифр этого числа: 8677189525 (это то место, где теряется точность)

А затем, чтобы решить мою проблему, мне нужно проверить, что эти 10 последних цифр содержат все цифры от 1 до 9

1 Ответ

3 голосов
/ 09 марта 2019

Для больших чисел, я думаю, вы должны добавить суффикс n:

let number = BigInt(123456789)
console.log(number.toString())
console.log(number.toString()[3]) // Result is fine

let bigNumber = 1234567891111111111111111111111111111n // <-- n suffix, literal syntax
console.log(bigNumber.toString())
console.log(bigNumber.toString()[30]) // result

let bigNumber2 = BigInt('1234567891111111111111111111111111111') // <-- also works as a string, in case you can't use the literal for some reason 
console.log(bigNumber2.toString())
console.log(bigNumber2.toString()[30]) // result
...