Предположим, у меня есть следующие данные:
1234
Как я могу получить следующий результат?
3412
Это достигается двойным циклическим сдвигом (или поворотом) цифр ввода.
Я пробовал следующий код:
number = 1234
bin(number >> 1)
но это не дает тех результатов, которых я ожидал.
Кстати, это называется правильным вращением.
"но на выходе я получаю 3412". Это странно, на моей машине этот код печатает 0b1001101001. Я думаю, что первое, что вам следует сделать, это поискать в документации по ">>", чтобы убедиться, что "правое переключение" делает то, что вы думаете.
@Kevin, я пытаюсь преобразовать число в двоичное, затем сдвиг вправо, затем двоичное в число






Я бы преобразовал в строку, чтобы иметь возможность разрезать ее.
number=1234
right_shift_no = 2
new_number = int(str(number)[right_shift_no:]+str(number)[:right_shift_no])
Спасибо!! Логика решения этой моей проблемы сложна. спасибо за то, что поделились простой логикой
Вот версия для ленивца:
>>> from collections import deque
>>> number = 1234
>>> d = deque(str(number))
>>> d.rotate(2)
>>> result = int(''.join(d))
>>> result
3412
Оператор >> выполняет двоичный сдвиг.
Он перемещает двоичное представление 1234 на место вправо, отбрасывая самый правый (наименее значимый) бит.
Поэтому ваш код не приводит к 3412.
Вместо этого вы, вероятно, захотите вращать строку:
>>> def rotr(string, n):
... return string[n:] + string[:n]
...
>>> rotr("1234", 2)
'3412'
Вы также можете впоследствии преобразовать его обратно в целое число.
>>> int('3412')
3412
Благодарность!! опять же, как @onno, логика проще, чем я думал, чтобы решить проблему
Если вы должны придерживаться чисел (хотя я бы сначала выбрал строковый вариант)
from math import log10, floor
s = 2 # digits to shift by
p = 10 ** s # that as a power of 10
n = 1234
rhs = n // p # right hand side of result (here 12)
rhs_n = floor(log10(rhs)) + 1 # number of digits in rhs
rhs + (n % p) * 10 ** rhs_n # add other digits, n % p, shifted by size of rhs
и все вместе в функции
from math import log10, floor
def rotate(n, s):
p = 10 ** s
rhs = n // p
return rhs + (n % p) * 10 ** (floor(log10(rhs)) + 1)
эй, спасибо !! Вы должны объяснить мне, что это немного отличается от того, что я думал
@TanyaChaudhary объяснила
Прежде всего, вам, вероятно, следует сохранить его как строку, а не целое число