Вот моя попытка в Python:
def give_me_math(n):
if n % 2 == 1:
n = n - 1 # we need to make every odd number even, and add back one later
odd = 1
else:
odd = 0
exps = []
while n > 0:
c = 0
num = 0
while num <= n/2:
c += 1
num = 2**c
exps.append(c)
n = n - num
return (exps, odd)
Результаты:
>>> give_me_math(100)
([6, 5, 2], 0) #2**6 + 2**5 + 2**2 + 0 = 100
>>> give_me_math(99)
([6, 5, 1], 1) #2**6 + 2**5 + 2**1 + 1 = 99
>>> give_me_math(103)
([6, 5, 2, 1], 1) #2**6 + 2**5 + 2**2 + 2**1 + 1 = 103
Я считаю, что результаты являются точными, но я не уверен насчет других критериев.
Edit:
Результат: Рассчитывает примерно на одну секунду.
>>> give_me_math(10**100 + 3435)
([332, 329, 326, 323, 320, 319, 317, 315, 314, 312, 309, 306, 304, 303, 300, 298, 295, 294, 289, 288, 286, 285, 284, 283, 282, 279, 278, 277, 275, 273, 272, 267, 265, 264, 261, 258, 257, 256, 255, 250, 247, 246, 242, 239, 238, 235, 234, 233, 227, 225, 224, 223, 222, 221, 220, 217, 216, 215, 211, 209, 207, 206, 203, 202, 201, 198, 191, 187, 186, 185, 181, 176, 172, 171, 169, 166, 165, 164, 163, 162, 159, 157, 155, 153, 151, 149, 148, 145, 142, 137, 136, 131, 127, 125, 123, 117, 115, 114, 113, 111, 107, 106, 105, 104, 100, 11, 10, 8, 6, 5, 3, 1], 1)
800 цифра работает слишком быстро:
>>> give_me_math(10**800 + 3452)
Но выход слишком долго, чтобы разместить здесь, что ФОС относятся конечно.
Сложность времени здесь 0 (ln (n)), поэтому она довольно эффективна.
Есть ли какой-то критерий, что вам нужна формула для использования? Существует бесконечное число выражений, которые будут оцениваться с заданным числом. – kindall
Lisp отлично подходит для работы с большими номерами. Если вы хотите «элегантное» представление числа, вы можете вычислить кучу разных представлений, используя отдельные сложные алгоритмы, а затем выбрать самый короткий. – moorephysics
Ваша проблема звучит подобно сжатию большого количества бит. Я бы посмотрел, как работают общие алгоритмы сжатия. –