本記事は管理人が競技プログラミングを始めたため,その精進日記としてログを取ったものです。アウトプットして積極的にモチベーションを上げていく作戦です。記事目次は以下をご覧ください。
【競プロ精進日記】目次まとめ
ABC
Atcoder Beginner Contestの過去問を解いています。最低限のコメントと一言が添えられています。
...
スポンサーリンク
AtCoder Beginners Selection
AtCoder Beginners Selectionの問題を1から解いていくシリーズです。使用言語はc++とpythonです。今回はABC083B Some Sumsです。
c++
#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;
int main() {
int N, A, B = 0;
int ans = 0;
int cnt = 0;
cin >> N >> A >> B;
rep(i, N){
cnt = i+1;
int wa = 0;
// ここがキモ。10で割ったあまりを見ていくことで10進数の各桁の数字を抽出する。
rep(j, 5){
wa += (cnt%10);
cnt /= 10;
}
if (A <= wa && wa <= B) ans+=i+1;
}
cout << ans << endl;
}
ハマった問題です。10進法の各位の和は,10で割ったあまりを見ていくことで抽出することができるのですね。stringで受け取って1文字ずつintに変換しようとしていました。あちゃちゃ。forループの回数が5であるのは,Nが大きくても10^4であることがわかっているからです。最大で5ケタ目まで調べればOKですよね。
python
N, A, B = map(int, input().split())
# for文で利用されている変数を突っ込むため書き換えないようにローカル変数として関数内で利用する
def check_wa(n):
ans = 0
while n > 0:
ans += int(n%10)
n /= 10
return ans
ANS = 0
for n in range(N):
wa = check_wa(n+1)
if A <= wa and wa <= B:
ANS += n+1
print(ANS)
pythonでも方針は同様です。ただ,c++のときより少し賢く実装しています。まず,各位の和の計算をforループではなくwhileで計算しています。こちらの方が汎用性が高いです。また,N以下の整数を調べていくときに,for文で利用している変数nを調べるのですが,こいつを書き換えてしまうとエラーを起こしかねないので,関数内のローカルな変数として処理をしてみました。c++のときよりスマートな書き方になっていると思います。