』を解いている際に見つけた問題を解いてみました。以前LeetCodeでも似たような問題を解いた気がしたんですが、ちょっと探してみても見つけられず...。今回はC++でコードを書いてみます。演算の対象となる値はint型、答えもint型と仮定します。後ほど何かと使用するので、まずは符号を反転させる関数を書いてしまいます。int型では、マイナスの値は2の補数で表現されているので、ビット反転させて1を足せば符号が反転します。符号が反転できれば、減算は単純です。考えてあげればいいのです。注意が必要なのがオーバーフローです。bがINT_MINの場合は、符号を反転させるとオーバーフローを起こしてしまうので、この場合だけaとbをうまいことずらしてあげてオーバーフローを防ぐ必要があります。書き換えてオーバーフローを防いでいます。bがINT_MINの場合は符号を逆転させるとオーバーフローするので、1を足してあげる。オーバーフローするので気にしない。いうように、aをb回足したものになります。負の数乗算の場合は、符号だけ別に考えてあげれば、同じ方法で考えることができます。乗算でも、オーバーフローするケースがあるので注意が必要です。ans;}除算こちらも乗算とほぼ同様です。a/bのaもbもどちらも正の数の場合は、aからbを引けるだけ引いてあげればいいです。負の数が与えられた場合は、乗算と同様正の数に直して割り算した後符号を合わせます。これで、intのキャストと同様に0の方向に丸め込まれた整数が帰ってくるはずです。オーバーフローの処理は少し面倒くさいです。bだけがINT_MINの場合は常に答えは0となるので問題ないのですが、aだけがINT_MINの場合が厄介です。この場合は、という変形をしてaの値を少しずらしてあげます。bはINT_MINより小さくなるので、オーバーフローは起きなくなります。b)はオーバーフローしてしまうので、という変形でオーバーフローを防ぎます。ゼロ除算の処理も忘れずに。ans;}簡単にテストいくつかのテストケースをこれらの関数に投げてみます。-715827882...よさそうですね。したら、オーバーフロー周りの処理が甘いところはあるかもしれません。アーカイブおすすめの本はてなブログをはじめよう!kanohkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。