hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

Atcoder 灰diff埋め ARC041~ARC055 振り返り

ABC048 A - 階段の下【AC】

 AとBの符号が同じ時と異なるときで返す値を変える問題です.負の値の時-1を,正の値の時-1を返すsign関数を定義し,if sign(A)==sign(B)とすればよいことが分かります.
 sign関数は,例えばシンプルにif x<0 return -1 else return 1のように実装しても良いです.今回は,よりシンプルに実装する方法を紹介します.
 引数の絶対値を返す,つまり引数の符号を+に変換する関数absを使います.x//abs(x)とすると必ず値は1か-1になります.絶対値が同じ数字で分母分子になっているからです.違いは分子の符号だけなので,分子の符号が返る値の符号と一致するようになります.このようにsign関数を作る事で一つのシンプルな式で実装出来ます.しかし,この実装方法ではこの問題のように引数が0にならないことが保証されている時のみ使えることに注意します.分母に0が入ると0除算になってしまいエラーとなる為です.

A, B = map(int, input().split())
print(B-A) if A//abs(A) == B//abs(B) else print(B-A-1)