0

我是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
4

4 回答 4

5

这听起来像家庭作业,所以我只是给你一个提示。您可以使用该bin函数来获取整数的二进制表示,而不是做所有这些位的操作。要获得一个具有相同数量的数字,只需在除第一个位置之外的任何位置添加一个零,然后检查第二个参数做什么int来获取一个数字。

于 2012-08-13T19:58:57.860 回答
2

由于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
于 2012-08-13T20:28:53.793 回答
1

一般来说,这确实是理解二进制数的问题。请记住,将数字乘以 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
于 2012-08-13T19:59:19.767 回答
1

m = n<<1

运算符<<是左二元移位。它将二进制表示中的所有内容向左移动一个位置,并在右端插入一个零。这将使数字的值加倍,但请注意影响 s 的数量,1因为您只是在移动位。

一些例子

0001 << 1 == 0010
0010 << 2 == 1000
0101 << 1 == 1010
1000 >> 1 == 0100

此操作比乘法更快,并且可以在乘以 2 的幂时替换它。

>>> 5*2 == 5 << 1
True
>>> 10*4 == 10 << 2
True
>>> 3*8 == 3 << 3
True

这样想吧。如果我问你“868554 * 6 是什么?” 你必须做一些思考。但如果我说“456103284 * 10 是什么?” 您只需在右端添加一个 0 即可。计算机可以做类似的事情,但使用 *2 而不是 *10

于 2012-08-13T20:02:37.343 回答