実現したいこと
整数を入力した値に対して二進数に変換をしたい。また桁数10になのであまった位には0を追加する
前提
問題文
整数 N が 10 進法表記で与えられます。N を 2 進法に変換した値を出力するプログラムを作成してください。
制約
N は 1 以上 1000 以下の整数
■■な機能を実装中に以下のエラーメッセージが発生しました。
該当のソースコード
python
1N = int(input()) 2count = 10 3ans = [] 4while N != 0: 5 ad = N%2 6 N = N//2 7 ans.insert(0,ad) 8 count -=1 9 print(ans) 10 11for i in range(count): 12 ans.insert(0,0) 13print(ans) 14num = ''.join(map(str, ans)) 15print(num) 16
補足情報(FW/ツールのバージョンなど)
OS 名 Microsoft Windows 11 Home
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
整数を入力した値に対して二進数に変換をしたい。
また桁数10なのであまった位には0を追加する
桁数が固定(10桁)なら,for
ループを使った方がわかり易いかもしれません。
記述例を下記に示します。
Python
1N = 1000 2digit = 10 3 4n, lst = N, [] 5for i in range(digit): 6 lst.append(n % 2) 7 n //= 2 8 9bin_str = ''.join(str(i) for i in reversed(lst)) 10print(bin_str) 11# 1111101000
投稿2025/09/07 13:32
総合スコア507
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/09/12 21:56

0
9行目、13行目に、デバッグ出力用のprint(ans)
が残っているのが原因ではないでしょうか。これらを削除してみてください。
投稿2025/09/06 21:15
総合スコア2546
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
Pythonの場合、bin() と int.bit_length() が用意されていますので、それらを利用すると以下の様に書くことができます。
python
1N = int(input()) 2count = 10 3bin_str = '0'*(count - N.bit_length()) + bin(N)[2:] 4print(bin_str)
もしくは f-strings を利用します。参考にしてみてください。
python
1N = int(input()) 2print(f'{N:010b}')
投稿2025/09/06 08:12
編集2025/09/06 09:02総合スコア21449
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/09/07 14:20

0
この問題に特化した解はMelian氏が提示した解以上のモノは得られないと思う。
値を出力するプログラム
と言われてる以上、Pythonのファンシーな機能を使って、文字列を生成する以上に上手いテはない。
非常に直接的な解だと思う。
そこでここでは、もうちょっと一般化したユーティリティ作成を紹介しようと思う。
Python
1#!/usr/bin/env python3 2 3class unfoldr(object): 4 def __init__(self, f, seed): 5 self.f = f 6 self.seed = seed 7 def __iter__(self): 8 return self 9 def __next__(self): 10 match self.f(self.seed): 11 case a, b: 12 self.seed = b 13 return a 14 case None: 15 raise StopIteration 16 17if __name__ == '__main__': 18 ans = ''.join(reversed(list(unfoldr(lambda N: None if N == 0 \ 19 else (str(N % 2), N // 2), int(input()))))) 20 print('0' * (10 - len(ans)) + ans) 21 22
ここで作成したイテレータunfoldr
は、Python組み込みのイテレータrange
の亜種だ。
と言うより、range
の上位互換だ。
Python
1>>> [i for i in range(3)] 2[0, 1, 2] 3>>> [i for i in unfoldr(lambda x: None if x == 3 else (x, x + 1), 0)] 4[0, 1, 2] 5
従って、単純には、range
はunfoldr
を利用すると次のように書ける。
Python
1def range(*args): 2 match args: 3 case stop,: 4 return unfoldr(lambda x: None if x >= stop else (x, x + 1), 0) 5 case start, stop: 6 return unfoldr(lambda x: None if x >= stop else (x, x + 1), start) 7 case start, stop, step: 8 return unfoldr(lambda x: None if x >= stop else (x, x + step), start) 9
unfoldr
はrange
の上位互換な故、unfoldr
の機能を制限する事でrange
が書けるわけだ。
unfoldr
はHaskellと言うプログラミング言語のunfoldr
をPython向けに移植したモノだ。
unfoldr
は引数を2つ取り、第一引数は関数、第二引数に「シード」と呼ばれる単一の値(データ)を取る。
ここで第一引数で取る関数のカタチが特徴的だ。ここではラムダ式を使うが、作成すべき関数は次のルールに従う。
Python
1lambda x: None if 終了条件 else (取り出す値, 次のシード)
何らかの終了条件を満たせばNone
を返すようにすること。そうじゃなければタプルを返すように書く。
そのタプルは2要素のタプルで、第一要素は生成するリストの要素、第二要素は「シードをどう加工してゆくか」の情報になっている。
結果、unfoldr
は初期値として与えられたシードから粛々とリストの要素を生成していって、最終的にリスト(このコードだと正確にはリストを生成するイテラブル)を返すわけだ。
Python
1## 2 乗のリスト 1^2 ... 10^2 2>>> list(unfoldr(lambda x: None if x > 10 else (x * x, x + 1), 1)) 3[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 4
見方によっては、unfoldr
はリスト内包表記/map
とrange
の合わせ技を一つでやり抜く為のイテレータに見えるだろう。
Python
1>>> [i ** 2 for i in range(1, 11)] 2[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 3>>> list(map(lambda x: x ** 2, range(1, 11))) 4[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 5
いずれにせよ、unfoldr
はかなり便利な汎用的なユーティリティとなる。
例えば題意に沿うと、基本的には次のように一行で書いて結果のリストを得る。
Python
1>>> list(unfoldr(lambda x: None if x == 0 else (x % 2, x // 2), 13)) 2[1, 0, 1, 1] 3>>> list(unfoldr(lambda x: None if x == 0 else (x % 2, x // 2), 37)) 4[1, 0, 1, 0, 0, 1] 5>>> list(unfoldr(lambda x: None if x == 0 else (x % 2, x // 2), 1000)) 6[0, 0, 0, 1, 0, 1, 1, 1, 1, 1] 7
これらは「逆順のリストになる」んで、ちょっとしたデータ変換で文字列を得ることが出来るだろう。
Python
1>>> ''.join(reversed(list(unfoldr(lambda x: None if x == 0 else (str(x % 2), x // 2), 13)))) 2'1101' 3>>> ''.join(reversed(list(unfoldr(lambda x: None if x == 0 else (str(x % 2), x // 2), 37)))) 4'100101' 5>>> ''.join(reversed(list(unfoldr(lambda x: None if x == 0 else (str(x % 2), x // 2), 1000)))) 6'1111101000' 7
このunfoldr
の実装はrange
と同様のイテレータだが、range
と違って直接reversed
出来ない。
結果、list
化した上でreversed
して更に・・・とひと手間かかる。
人によっては「そもそもunfoldr
イテレータに__reversed__
特殊メソッドを組み込むべきじゃない?」って言うだろう。
ただし、unfoldr
は第一引数に与える関数が終了条件を持たない場合、無限長リスト(要はこれもイテラブル)を返すようになっている。無限長リストが返る可能性があるなら、直接reversed
が出来るのは危険だ。
よって、手間でも、キチンと有限長になる事を確認してからlist
化してreversed
した方が安全だろう。
Python
1#!/usr/bin/env python3 2 3import sys 4from itertools import islice 5 6class unfoldr(object): 7 def __init__(self, f, seed): 8 self.f = f 9 self.seed = seed 10 def __iter__(self): 11 return self 12 def __next__(self): 13 match self.f(self.seed): 14 case a, b: 15 self.seed = b 16 return a 17 case None: 18 raise StopIteration 19 20# わざと終了条件を与えず、無限長の素数列を得る例 21def primes(): 22 yield 2 23 for p in unfoldr(isPrime, 3): 24 yield p 25 26def isPrime(n): 27 while True: 28 for p in primes(): 29 if p ** 2 > n: 30 return n, n + 2 31 elif n % p == 0: 32 n += 2 33 break 34 35 36if __name__ == '__main__': 37 print(list(islice(primes(), int(sys.argv[1])))) 38
いずれにせよ、Pythonにunfoldr
と言うユーティリティを備えとけば色々と便利だし、ある種、汎用アルゴリズムらしい抽象的アルゴリズムだ。
そんなカンジかな。
以上。
投稿2025/09/07 17:56
編集2025/09/08 22:38総合スコア209
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。