NF

地方で働くプログラマ

ABC083B - Some Sums 不正解

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);