Rust で[ABC302 の A 問題](https://atcoder.jp/contests/abc302/tasks/abc302_a)を解いていて、割り算をして商を切り上げた値がほしくなった。
Ruby なら以下のように書いていた。
```ruby
a = 3
b = 2
(a / b.to_f).ceil
```
Rust で同じロジックで書こうとするとこうなる。
```Rust
let a: i32 = 3;
let b: i32 = 2;
(a as f64 / b as f64).ceil() as i32;
```
型変換が多くて大変。
剰余があるときに商を 1 足すことはできる。
```rust
let (div, rem) = (a / b, a % b);
let ceil;
if rem == 0 { ceil = div } else { ceil = div + 1 }
```
でも、あんまり `if` 書きたくないなあ。
他の人の提出を見ていたら、こんなふうに書いてる人が多かった。
```rust
(a + b - 1)/ b;
```
割る数 - 1 を割られる数に足している。
もともと割り切れる場合は、割る数 - 1 を足しても、商の数は変わらない。
余りがある場合は、余りは 1 以上なので、割る数 - 1 を足すと商が 1 大きくなって切り上げの値になる。
なるほど、言われてみればたしかに!
このあたりは、num-integer を使うことでも書ける。
`div_rem` があって、
```rust
let (div, rem) = (a / b, a % b);
```
は
```rust
let (div, rem) = a.div_rem(&b);
```
と書ける。
[https://docs.rs/num-integer/latest/num_integer/trait.Integer.html#tymethod.div_rem](https://docs.rs/num-integer/latest/num_integer/trait.Integer.html#tymethod.div_rem)
また、num-integer には `divceil` というメソッドがある。
```rust
integer::div_ceil(a, b);
```
[https://docs.rs/num-integer/latest/num_integer/fn.div_ceil.html](https://docs.rs/num-integer/latest/num_integer/fn.div_ceil.html)
これがまさに欲しかったもの!
でも、競プロやる上ではメソッドを知らないこともあるので、こういう Tips を引き出しに入れておいてもいいなと思った。他の言語でも使えるしね。
ちなみに `divmod` の気持ちで Rust で余りの変数に `mod` としようとしたところ、予約語だということを学んだ。
[https://doc.rust-jp.rs/book-ja/appendix-01-keywords.html](https://doc.rust-jp.rs/book-ja/appendix-01-keywords.html)