AtCoder-ABC186 C - Unlucky 7【Python解答例】
AtCoderのパナソニックプログラミングコンテスト(AtCoder Beginner Contest186)のC問題の解答例を書いていきます。
Panasonic Programming Contest (AtCoder Beginner Contest 186) - AtCoder
AtCoder Beginner Contest186 C - Unlucky 7
問題文
高橋君は7が嫌いです。
1以上N以下の整数のうち、10進法で表しても8進法で表しても7を含まないような数はいくつありますか?
制約
・1≤N≤10^5・Nは整数である。
解答例
n = input() int_n = int(n) ans = 0 for i in range(1,int_n + 1): can = 1 str_i = str(i) for j in range(len(str_i)): if str_i[j] == "7": can = 0 if can == 1: i = oct(i) str_o = str(i) for k in range(len(str_o)): if str_o[k] == "7": can = 0 if can == 1: ans += 1 print(ans)
解説
問題文通り1以上N以下の整数のうち、10進法で表しても8進法で表しても7が出てこない数を求める問題です。
問題の意味は理解しやすいですね。
今回、入力Nをstring型で受け取りました。
ans変数を用意して解答になる数をかぞえていきます。
次のループ分で1からNまでの数字で、10進数でも8進数でも7が出てこないか調べていきます。
can変数は7が出てこなければ1、7が出てきたら0にする変数です。
調べる数はiですが、こちらもstr_i変数にstringとして格納します。
次のループで調べる数iにおいて10進数で各桁に7が出てこないか調べます。
7が出てきたらcan変数を0とします。
10進数で7が出てこなかったら次は8進数を調べます。
oct関数を使うと調べる数iを8進数に簡単に変更できました(コンテスト中にググるのに慣れてきました…)
次は10進数と同様に、各桁に7が出てこないか調べていきました。
同様に7が出てきたらcan変数に0を代入します。
10進数と8進数を調べた後でもcan変数が1ならば、7が出てこなかったことになりますので、ansに1を足します。
この処理をNまで繰り返せば求める解答となりACでした。
各桁と7を比較するときint型の7で比較してしまい、全然求める解答にならずあせりました。
iをstr型にしていたので比較対象もstr型で比較しないとダメなんですね…
コンテスト中はあたふたしましたが、なんとかC問題もクリアできました。
D問題以降は正解したことがないので、復習頑張りたいです。
D問題も理解出来たら記事にしていきたいと思います。
パナソニックプログラミングコンテスト(ABC186)の関連記事はこちら
ebisuke33.hatenablog.com