Как найти все?
От: olimp_20  
Дата: 20.02.17 13:36
Оценка:
Найти все числа в десятичной системе счисления с таким свойством: если десятичные цифры числа записать в обратном порядке, получится то же число, только в шестнадцатеричной системе.

Для двузначных чисел: a*10+b=b*16+a ==> a*9=b*15 ==> a = b*5/3 ==> b=3 и а=5.

Настораживает, что в условии задачи сказано "Найти все числа..."
Вопрос: 1) существует ли какая-либо верхняя граница для чисел, которые удовлетворяют критерий поиска; 2) существует ли какая-либо числовая закономерность для решения задачи?
Re: Как найти все?
От: lpd Черногория  
Дата: 20.02.17 13:46
Оценка:
Здравствуйте, olimp_20, Вы писали:

_>Найти все числа в десятичной системе счисления с таким свойством: если десятичные цифры числа записать в обратном порядке, получится то же число, только в шестнадцатеричной системе.


_>Для двузначных чисел: a*10+b=b*16+a ==> a*9=b*15 ==> a = b*5/3 ==> b=3 и а=5.


_>Настораживает, что в условии задачи сказано "Найти все числа..."

_>[i]Вопрос: 1) существует ли какая-либо верхняя граница для чисел, которые удовлетворяют критерий поиска;

Пускай длина рассматриваемого числа n разрядов. Тогда должно быть: 1*16^(n-1) <= 9*10^(n-1) * 2, т.к. шестнадцатеричные числа даже с 1 в старшем разряде возрастают быстрее при росте числа разрядов, чем десятичные с 9 в старшем.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[2]: Как найти все?
От: kov_serg Россия  
Дата: 20.02.17 15:06
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>Пускай длина рассматриваемого числа n разрядов. Тогда должно быть: 1*16^(n-1) <= 9*10^(n-1) * 2, т.к. шестнадцатеричные числа даже с 1 в старшем разряде возрастают быстрее при росте числа разрядов, чем десятичные с 9 в старшем.

А что мешает числу иметь в конце нули?
Re: Как найти все?
От: Кодт Россия  
Дата: 20.02.17 16:10
Оценка:
Здравствуйте, olimp_20, Вы писали:

_>Найти все числа в десятичной системе счисления с таким свойством: если десятичные цифры числа записать в обратном порядке, получится то же число, только в шестнадцатеричной системе.

_>Настораживает, что в условии задачи сказано "Найти все числа..."
_>Вопрос: 1) существует ли какая-либо верхняя граница для чисел, которые удовлетворяют критерий поиска; 2) существует ли какая-либо числовая закономерность для решения задачи?

1. Конечно, существует.
Рассмотрим k-разрядные числа.
Десятичные лежат в интервале Dk = [10**(k-1) ; 10**k)
Шестнадцатиричные — в интервале Hk = [16**(k-1) ; 16**k)

Функция переворота-с-перебазированием k-разрядных чисел Rk : Dk -> Hk
Мы ищем неподвижные точки этой функции, fk : Rk(fk) = fk
Это значит, что они должны принадлежать пересечению интервалов Fk = Dk ∩ Hk = [16**(k-1) ; 10**k)

То есть, как минимум, должно выполняться условие 16**(k-1) < 10**k
(k-1)*log(16) < k*log(10)
k < log(16) / (log(16)-log(10))
k < 5.899

И действительно, 10**6 = 1'000'000, 16**5 = 1'048'576

В принципе, перебрать 99999 чисел, написав 5 функций переворота под каждый размер — дурное дело нехитрое
Перекуём баги на фичи!
Отредактировано 20.02.2017 16:11 Кодт . Предыдущая версия .
Re: Как найти все?
От: Кодт Россия  
Дата: 20.02.17 18:31
Оценка:
Здравствуйте, olimp_20, Вы писали:

_>Найти все числа в десятичной системе счисления с таким свойством: если десятичные цифры числа записать в обратном порядке, получится то же число, только в шестнадцатеричной системе.


def dechex(n):
  return int(str(n)[::-1], 16)
  # воспользуемся стандартной библиотекой питона,
  # сконвертируем число в строку, развернём, и сконвертируем обратно в число

for n in xrange(1, 10**6):
  if n % 10 and n == dechex(n):
    # числа, кратные 10, дают ведущий 0 при перевороте
    # поэтому мы их проигнорируем
    print n


1
2
3
4
5
6
7
8
9
53
371
5141
99481


Если разрешить ведущие нули, то следующее число будет 8520280, а вот что дальше — тут надо думать...
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.