プログラミング

【競プロ精進日記】ABS編<6>

本記事は管理人が競技プログラミングを始めたため,その精進日記としてログを取ったものです。アウトプットして積極的にモチベーションを上げていく作戦です。記事目次は以下をご覧ください。

内容は管理人の推測や恣意的な感想を大いに含みます。もし間違い等ありましたらご指摘ください。あくまでも参考程度にお願い致します。

【競プロ精進日記】目次まとめ 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++のときよりスマートな書き方になっていると思います。

ABOUT ME
zuka
京都大学で機械学習を学んでいます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

※ Please enter your comments in Japanese to prevent spam.