Atcoder Begineers Contest 186 C問題について考えます。
考え方
①10進数と8進数で7を含む数字があれば、カウント用の変数に1ずつ加えていき、入力値からカウント用の変数を引く。
②oct(変数) とすることで8進数に変換することができる。戻り値は文字列なので、7を含むか判定したい場合は文字列としての7がoct(変数)の戻り値に含むかを判定する。10進数はループ変数iを文字列に変えてから7を含むか判定する。
③10進数と8進数で7を含む数字が重なることがあるので、重複を削除したうえで入力値から引く。
提出1 不正解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
n = int(input()) a=0 b=0 list = [] for i in range(n): #print(oct(i),i) if '7' in oct(i):C問題 #print(i) a += 1 list.append(i) if '7' in str(i): #print(i) b += 1 list.append(i) print(n-len(set(list))) |
8進数で7を含むときはaを、10進数で7を含むときはbをインクリメントし、
その時のループ変数 i をリストに保存。
10進数と8進数で重複した数字がリストに保存されるので、
set を使って重複を削除し、その要素数をnから引いてみました。
入力例では2通りともうまくいきましたが、提出時には全然ダメでした。
提出2 正解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
n = int(input()) a = 0 #8進数用のカウンタ b = 0 #10進数用のカウンタ list = [] #7を含む数字があった場合にその時のiの値を追加するためのリスト for i in range(n+1): #range(n)からrange(n+1)に修正 if '7' in oct(i): #oct(i)の戻り値は文字列のため、'7'とする a += 1 list.append(i) if '7' in str(i): b += 1 list.append(i) #listには、8進数と10進数のどちらにも7を含む値があるため、setを使って重複を削除し、その要素数を入力値から引いている。 print(n-len(set(list))) |
提出1を一部修正して再提出したところ、ACとなりました。
for文で、繰り返しをnまでとしていたことが原因でした。
for i in range(n+1): と修正してACできました。
提出1で残っていたコメントアウトも削除しています。
参考記事
①方針がわかりやすいです。
[AtCoder] ABC 186 C – Unlucky 7 | ヤマカサの競技プログラミング (yamakasa.net)
②再起関数と剰余の計算を使う場合:python
AtCoder Beginner Contest 186 C問題+D問題 – 電脳ルギア (hatenadiary.jp)
コメント