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)