AtCoder Beginners Selectionの「ABC083B - Some Sums」がAC(正解)にならない件。サンプルの3ケースは問題なくて、02.txtのケースだけがWA(不正解)になる。当たり前だけどケースの内容が分からないので不合格の理由が分からず。Beginners Selectionだしケース公開して欲しかったり。
私は以下に示す通り力技でやりましたが、シフトを使って解くのが一般的だし速いようです。一応シフトの方法は理解できたんですが、元の解法がダメな理由が分からないのでスッキリしないな…
*WAになる提出コード
#include <iostream> #include <string> #include <stdio.h> using namespace std; int main() { int n,a,b; int cnt = 0; cin >> n >> a >> b; for(int i=0; i<=n; i++){ int sum = 0; std::string str = std::to_string(i); for(int i=0; i<str.length(); i++){ char c = str[i]; sum += atoi(&c); } if(sum >= a && sum <= b){ cnt += i; } } cout << cnt << endl; return 0; }
(2019/8/14追記)
思い出してやってみたらこれで行けた。(sum変数の意味変わってるけど)
atoi使うかしか変わってないけど何で前のコードダメなんだろう。ちなみに、前のコードが内側のループ添え字が間違ってる事に気づいたが、コンパイラが上手く処理してくれるので結果は同じでした。境界値も幾つか試したけど分からず。
まぁ正解コードがあるので、後で条件全部突っ込んでみよう。
#include <iostream> using namespace std; int main(){ int n,a,b; cin >> n >> a >> b; int sum = 0; for(int i=1; i<=n; i++){ std::string str = std::to_string(i); int tmp = 0; for(int j=0; j<str.length(); j++){ tmp += int(char(str[j]) - '0'); } if(tmp >= a && tmp <= b){ sum += i; } } cout << sum << endl; return 0; }
(2019/8/14再追記)
いやダメだ。N=48,A=1,B=1で先のコードがNGだったけど、cout入れると結果正常になるので、メモリ破壊系だろうか…。だとしたら多分、下の部分が良くない気がする。ちなみにNの試行を1から始めるかどうかでも結果は変わった。現状の家の環境(オンラインコンパイラのみ)だとこれ以上は調べられなそう。今後会社に持ってってデバッガかけてみます。
char c = str[i];
sum += atoi(&c);