okuzawatsの日記

Android / Kotlin / GitHub Actions Enthusiast 🤖

[Kotlin] 負数に対する除算の商と剰余

AtCoder Beginner Contest 239のB問題を解いていてWAになり、解説を読んでいたら勉強になったのでメモ。負の値に対する除算の商と剰余について。

実は負数の除算はいくつか定義があり、プログラム言語によって定義が異なる という大きな問題があります。詳しい話は以下で説明しますが、例えば −24 を割られる数、 10 を割る数として整数除算した時の答えは言語によって −2 になったり −3 になったりします。 解説 - デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239)

Kotlinの(Int型やLong型に対する)除算のドキュメントを探すと、例えばInt型なら div 関数を見れば良さそうでしょうか(Kotlinの算術演算子は operator fun でオーバーロードされる)。

ここには、0に近い方に丸めると記載されてます。

Divides this value by the other value, truncating the result to an integer that is closer to zero.

例えば -1 に対して 2 で除算を行うと、( -0.5 が 0 に近い方に丸められて) 0 となります。同様に -3 に対して 2 で除算を行うと、( -1.5 が 0 に近い方に丸められて) -1 となります。

fun main() {
  println(-1 / 2) // 0, not -1
  println(-2 / 2) // -1
  println(-3 / 2) // -1, not -2
}

剰余がどうなるかというと、上記の除算の結果と整合する自然な値になります。

fun main() {
  println(-1 % 2) // -1
  println(-2 % 2) // 0
  println(-3 % 2) // -1
}

負の除算については注意して扱わないと思わぬバグを生みそうです。数年来プログラミングをしてきましたが、初歩的なところに理解のあやふやな知識があることに気付けて良かったです。

Reference

  1. 解説 - デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239)(最終アクセス日:2022年2月20日)
  2. div - Kotlin Programming Language(最終アクセス日:2022年2月20日)

#Kotlin

書いている人 😎

profile

茨城県つくば市在住のモバイルアプリケーションアーキテクト(Androidが得意です)。モバイルアプリのアーキテクチャ、自動テスト、CI/CDに興味があります。いわゆる「レガシーコード」のリファクタリング・リアーキテクチャが好きです。

Androidプロジェクトの開発速度低下にお悩みで、お手伝いが必要でしたら、メールフォームよりお気軽にお問い合わせください。

👉 もっと詳しく

著書 ✍

Android MVVMアーキテクチャ入門 🛠

Androidアプリ開発の初学者に向けた、MVVM(Model-View-ViewModel)アーキテクチャの入門書を書きました。初学者の方を確実にネクストレベルに引き上げる技術書です。NextPublishingより出版されています。

販売サイトへ 🏃

Android ユニットテスト ヒッチハイク・ガイド 🧳

Androidアプリのユニットテストに入門するためのガイダンスです。初学者が混乱せずにAndroidアプリのユニットテストを書き始めることができる、ということを目的としています。

販売サイトへ 🏃

関連記事 👀

お問い合わせ 📨

お名前

メールアドレス

お問い合わせ内容