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