python找出等于1'的数字;在它里面';s的二进制表示形式与输入数字中的表示形式相同

python找出等于1'的数字;在它里面';s的二进制表示形式与输入数字中的表示形式相同,python,count,binary,Python,Count,Binary,我是python编程新手。只是被这一个问题困住了。我必须取一个自然数n作为输入,输出将是一个自然数m,这样m>n,m的二进制表示中的1的个数=n的二进制表示中的1的个数。(示例输入:23,输出:27)下面是我写的。我的while循环有问题 n=int(input('input number:')) x='' for i in range(1,n+1): x=str(n%2)+x n>>=1 List=[] for i in x: List.append(

我是python编程新手。只是被这一个问题困住了。我必须取一个自然数n作为输入,输出将是一个自然数m,这样m>n,m的二进制表示中的1的个数=n的二进制表示中的1的个数。(示例输入:23,输出:27)下面是我写的。我的while循环有问题

n=int(input('input number:'))
x=''
for i in range(1,n+1):
    x=str(n%2)+x 
    n>>=1

List=[]

for i in x:
    List.append(i)
n_count=List.count('1') 
m=n+1
y=''
while m>n:
    for i in range(1,m+1):
        y=str(m%2)+y 
        m>>=1

    List2=[]
    for i in y:
        List2.append(i)
    m_count=List2.count('1')

    if m_count==n_count:
        print (m)
        break

    m=m+1

这听起来像是家庭作业,所以我给你一个提示。您可以使用
bin
函数获取整数的二进制表示形式,而不是进行所有的位旋转。要得到一个具有相同个数的数字,只需在第一个位置以外的任何位置添加一个零,然后查看
int
的第二个参数如何返回一个数字。

这确实是理解二进制数的一个问题。记住,将一个数字乘以2不会改变1的数量。所以你可以只做
n*2

您可以通过执行以下操作来验证它

n=int(input('input number:'))
m= n*2

print 'm is', m
print "n's 1s", bin(n).count('1')
print "m's 1s", bin(m).count('1')
print "m > n", m > n
m=n由于
bin()
返回一个表示二进制值的字符串,并且
count()
返回子字符串在字符串中出现的次数,因此可以循环直到找到一个数字。因为这看起来像是家庭作业,所以这里有一个大致的想法:

while m > n: # this may as well say "while True:", so maybe think of a better condition.
    m += 1
    if bin(m).count('1') == bin(n).count('1'): # if you find a better condition you won't need an if statement.
        break

您可以使用
bin()
获取整数的二进制表示,而不是自己滚动。这将是一个很好的代码问题。我把它压缩到了7行,我相信它可能会短得多。虽然没有提到,但我打赌OP应该返回最小的这样的数字。哦,这让事情变得不寻常了。如果你理解二进制的话,这仍然很简单。这个答案有一个变体,它给出了最小的数字,并且具有相同的比特数,大于输入。
>>> 5*2 == 5 << 1
True
>>> 10*4 == 10 << 2
True
>>> 3*8 == 3 << 3
True
while m > n: # this may as well say "while True:", so maybe think of a better condition.
    m += 1
    if bin(m).count('1') == bin(n).count('1'): # if you find a better condition you won't need an if statement.
        break