ただの適当な開発記

会社勤めしつつUnityでアプリ作ってる人の雑記

[AOJ]Volume 100 出力に関して

AIZU ONLINE JUDGE (AOJ)を進めていますよ。使用言語はjavaです。

サークルでjavaに精通している先輩がいらっしゃるのでとても頼りにしています。頼り過ぎはよくないと思うのですが。

Volume100(一番簡単な問題群)を10問ほど解き終えました。標準入力だけわかれば後は簡単だったのですが、出力の際に少しバグがでる点があったので書き残しておきます。

10008 A / B Problem

解いていたのはこの問題です。二つの整数が与えられて剰余を求める問題なのですが、とりあえず自分が最初に書いたコードを見てください。

import java.util.*;
class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
            int a= sc.nextInt();
            int b= sc.nextInt();
            int d=a/b;
            int r=a%b;
            double f =(double)a/(double)b;
            System.out.println(d+" "+r+" "+f);
    }
}

です。実行結果すると6つ目の値を入れたあたりでエラーが出てる模様。

たしかa=100000000000000 b=0とかだったかな。

このとき思った原因は2つ

aが大きすぎるので変数がintだと適切ではない
bが0なので分母=0となってしまい不適

1に関してはintではなくlongに入れてみました。しかし変わらず。

2に関してはb!=0とelseで分岐してみましたが変わらず。絶対2のミスのせいだと思って途方に暮れていたのですが(分岐させるのは正しいみたいです)、どうやらミスはそれだけではなく、

 System.out.println(d+" "+r+" "+f);

ここの出力の仕方が悪かったみたい。確証はないです。
正しくはprintfを用いて以下のようにするとうまく行きました。
これがいわゆる標準出力ってやつみたいですね。

 System.out.printf("%d %d %5f",d,r,f);

ちなみに%dは"整数を出力しますよ"の意で、%5fは"最低限5桁は確保(5)して、表し方は浮動小数点で10進数表示(f=floatのf?)"を意味するようです。

上記を踏まえ、さらには先輩に聞きつつ、さらにはぐぐって答えっぽいのを探したところ(←)

import java.util.*;

class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
			int a= sc.nextInt();
			int b= sc.nextInt();
			int d,r;
			if(b !=0){
				d=a/b;
			}else
				d=0;
		      r = a%b;
			double f =(double)a/(double)b;
			System.out.printf("%d %d %5f",d,r,f);
    }

}

無事に正解となりました。めでたし!

で、今日何問か解いてみて思ったことは、AOJの問題はプログラミングの上達に非常に有用なのではということ。
課題に対してよりシンプルかつ早く動くコードを書くというのは自分が今後絶対に求められるスキルだと思います。
その中で、サークルに精通した先輩がいること、内定先ではjavaも多く使う可能性があることを考えると、やって損はないのかなと。なによりもやっていてすごく楽しいです。
つーわけで今日も眠くなるまでぼちぼちやっていきます。