はじめに
AtCoder Beginner Contest 165 が開催されました。
その D問題でちょっとだけ嵌りましたので、復讐復習したいと思います。
今回のお題
AtCoder Beginner Contest 165 D - Floor Function
Difficulty: 505
今回のテーマ、床関数
Ruby
入力例1をエクセル先生で確認します。
丁度 7 で周期していることが分かります。
よくよく考えれば、7 で割っているのでそうなりますので、n が b - 1 以上の場合は関数 f の取り得る最大値、未満の場合は(単純増加ですので)n を関数 f に代入した値が答えとなります。
ruby.rb
a, b, n = gets.split.map(&:to_f)
if n >= b - 1
puts (a - a / b).floor
else
puts ((a * n / b).floor - a * (n / b).floor).floor
end
f.rb
a, b, n = gets.split.map(&:to_f)
いつもの癖でgets.split.map(&:to_i)
とコーディングしましたので、計算が合わず焦りました。
Ruby は型の変換が必要です。
Python
python.py
a, b, n = map(int, input().split())
if n >= b - 1:
print(int(a - a / b))
else:
print(int(a * n / b) - a * int(n / b))
Python は整数と整数の割り算により自動的に実数に変換するようです。
Perl
perl.pl
chomp (my ($a, $b, $n) = split / /, <STDIN>);
if ($n >= $b - 1) {
print int($a - $a / $b), "\n";
} else {
print (int($a * $n / $b) - $a * int($n / $b)), "\n";
}
Perl は整数と整数の割り算により自動的に実数に変換するようです。
Java
java.java
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = Integer.parseInt(sc.next());
Double b = Double.parseDouble(sc.next());
Double n = Double.parseDouble(sc.next());
sc.close();
if (n >= b - 1) {
System.out.println((int) (a - a / b));
} else {
System.out.println((int) (a * n / b) - a * (int) (n / b));
}
}
}
Java は型の変換が必要です。
Ruby | Python | Perl | Java | |
---|---|---|---|---|
コード長 | 138 Byte | 129 Byte | 169 Byte | 517 Byte |
実行時間 | 53 ms | 23 ms | 2 ms | 102 ms |
メモリ | 14204 KB | 9016 KB | 4788 KB | 35648 KB |
まとめ
- ABC 165 D を解いた
- Ruby に詳しくなった
- Python に詳しくなった
- Perl に詳しくなった
- Java に詳しくなった