カメヲラボ

主にプログラミングとお勉強全般について書いてます

ISBN(0)

10桁のISBNコード。
http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=2190
左から10,9,8...と重み付けして合計したものが11で割り切れれば正しいISBNコードだ。考えるのが面倒なので、例を問題からそのまま引用すると、



For example 0201103311 is a valid ISBN, since
10*0 + 9*2 + 8*0 + 7*1 + 6*1 + 5*0 + 4*3 + 3*3 + 2*1 + 1*1 = 55.
このような感じで、正しいISBNコードなら合計が11で割り切れる。


さて、この問題のインプットは、


0201103?11
のように10桁のうち1箇所が'?'になっていて、そこに当てはまる数を返すというプログラム。もし、適切な値が見つからなければ-1を返さなければならない。上記の例だと、正しいアウトプットは

3
ということになる。


この問題で厄介なのは、最後の1桁のみ取り得る値が0〜10で、他の部分は0〜9であるという点だ。最後の1桁が10になる場合は、'X'と表示しなければならない。


今のところ113byteという記録http://acm.pku.edu.cn/JudgeOnline/problemstatus?problem_id=2190&orderby=clen&language=-1を出したが、もう少し縮まるかもしれない。そろそろコードを晒したいところなのだが、頑張っている方が結構いらっしゃるようなのでもう少しだけ待つことにする。


これからはじめる人へのアドバイスとしては、


①とにかく11で割り切れるか調べるのだから、文字コードのまま計算しても全然問題ない。
文字コードのまま計算できるのであれば、'X'や'?'の判定もかなり単純に出来る。
③私は入力:getchar()、出力:puts()を使う
④ローカルテストで通らなくても気にしない^^
⑤決して諦めない!
↑ちょっと訂正。
④番はいつの間にかちゃんとローカルでも通るようになってました^^;
つまり、確率とかテストケースに頼るような方法ではないということです。


以上。皆さん頑張ってチョ(`ω´)