naiの日記

ソフトウェアエンジニアから放射線科診断医にジョブチェンジしました。趣味のことを書きます。

314. Roman numeral

終了しました。


トップのinaniwaさんの解はなんと93B。
減算則のチェックに、直前の値を保存せず、合計値を表す変数sが現在の値aで割り切れるかどうかで判定しています。
なるほど、確かにaの値は通常は広義単調減少で、しかも過去の値はすべて現在の値の倍数なので、これでチェックできますね。まったく思いつきませんでした。


他の人のコードも見ていて面白いです。
nnさんは、「500と1000が一発で表せない」という一番の問題をワイド文字で解決していて衝撃的でした。
nuさんは、-10と負数の論理和を取ることで-1と-10を作れているうえに、一つ答えを表示したときにprintfの返り値をs,p両方に代入することでs=0にする手間を省いています。
与えられた入力は、2行目以降で1バイト目に"I"が出てくるデータがないため次のループでs-=pされて消えるのですが、これは思いつかなかったです。
ちなみに私は、printfの書式"%d\n"の2,3,4バイト目の文字コードがそれぞれ100,10,0であることを利用しているのですが、3桁バイトの壁を越えることは出来ませんでした。


みなさん、お疲れ様でした。