文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

Debt Hell [AIZU ONLINE JUDGE 0007]

judge.u-aizu.ac.jp


問題

100000 に以下の操作を n 回おこなった後の値を求めよ。


・1.05倍し、1000未満を切り上げる


考察

まず 1.05倍する 操作についてですが、「v * 1.05」とするよりも「v * 105 / 100」としたほうが誤差が少なくなります。


次に 1000 未満を切り上げる 操作について。


値が 1000 で割り切れる場合は、1000 で切り上げる必要はなく、そのままの値にすればよいです。
そうでない場合は、1000 未満を切り捨ててから 1000 を足します。1000 未満を切り捨てるには、値から値を 1000 で割った余りを引けばよいです。

コード

void solve (FastScanner in, PrintWriter out, Methods ms) {
	
	int n = in.nextInt();
	double init = 100000;
	
	for (int i=0; i<n; i++) {
		init =  init * 105 / 100;
		init = init%1000==0? init : init - (init%1000) + 1000;
	}
	
	out.println((int)init);
	
}