0

私はPythonプログラミングの初心者です。この1つの問題に行き詰まりました。入力として自然数 n を取り、出力は m>n かつ m の 2 進表現での 1 の数 = n の 2 進表現での 1 の数となるような自然数 m になります。 (サンプル入力: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と、ビットをいじる代わりに、整数のバイナリ表現を取得できます。同じ数の 1 を持つ数値を取得するには、最初の場所以外の任意の場所にゼロを追加し、数値を取得するために の 2 番目の引数が何をするかを調べ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

m = n<<1

<<演算子は左バイナリシフトです。バイナリ表現のすべてを1桁左に移動し、右端にゼロを挿入します。1これにより、数値の値が2倍になりますが、ビットを移動するだけなので、sの数に影響することに注意してください。

いくつかの例

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を追加するだけです。コンピューターも同様のことができますが、*10ではなく*2を使用します

于 2012-08-13T20:02:37.343 に答える
1

これは、一般的な2進数を理解する上で実際に問題になります。数値に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 に答える