循环移动(或旋转)Python 中数字的数字
Circularly shifting (or rotating) the digits the digits of a number in Python
假设我有以下输入:
1234
如何获得以下输出?
3412
这是通过循环移动(或旋转)输入的数字两次获得的。
我试过以下代码:
number = 1234
bin(number >> 1)
但它没有产生我期望的结果。
我会转换为字符串以便能够对其进行切片。
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
>>
运算符执行 binary bitshift.
它将 1234
的二进制表示向右移动,丢弃最右边(最低有效位)的位。
因此您的代码不会导致 3412
。
您可能需要字符串旋转:
>>> def rotr(string, n):
... return string[n:] + string[:n]
...
>>> rotr("1234", 2)
'3412'
之后你也可以将它转换回整数
>>> int('3412')
3412
如果你必须坚持使用数字(尽管我会先使用字符串选项)
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)
假设我有以下输入:
1234
如何获得以下输出?
3412
这是通过循环移动(或旋转)输入的数字两次获得的。
我试过以下代码:
number = 1234
bin(number >> 1)
但它没有产生我期望的结果。
我会转换为字符串以便能够对其进行切片。
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
>>
运算符执行 binary bitshift.
它将 1234
的二进制表示向右移动,丢弃最右边(最低有效位)的位。
因此您的代码不会导致 3412
。
您可能需要字符串旋转:
>>> def rotr(string, n):
... return string[n:] + string[:n]
...
>>> rotr("1234", 2)
'3412'
之后你也可以将它转换回整数
>>> int('3412')
3412
如果你必须坚持使用数字(尽管我会先使用字符串选项)
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)