aoj-0004 Simultaneous Equation

はい、どうもyudegakiです。

atcoderのc問を埋めるとか言っていたのにすぐに違うサイトに浮気してしまいました。

だって難しいんだもん。解説が(ry

まあ自分の実力不足であるのは確かなので力をつけていくことにします(まあ今回の問題も重要な部分は先輩にアドバイスをもらいましたが)

ということで本題に入りましょう。

今回の問題はこちらSimultaneous Equation | Aizu Online Judge

なんか数字を与えるからxとyを出せ。ってことですね。

まあここまではただの数学だから簡単なんだけど、問題はここ→”xとyを小数点第4位を四捨五入して、小数点第3位までで出力せよ”...  は?こんなの簡単じゃんという方はお帰りください。私はこの処理をするコードが思いつかなかったのだ...(敗北)

簡潔に結論から言うと、int(1000 * x + 2 * (1000 * x - int(1000 * x))) / 1000.0 です。

まあ、何をやっているかというと2*(1000*x-int(1000*x))で四捨五入で繰り上げする箇所の処理。*1そこに1000倍したxを足してint型でキャストする。これで小数点第3桁までの数字を小数点より上(?)に配置して、int型キャストで下3桁以下の数字を処す。最後に1000で割って、あら不思議、四捨五入の完成よ☆

というわけで解説は以上。 四捨五入の書き方を学べてよかったです。ではまた逢う日まで。(最後にソースコードを貼っておわりにします)

#include<iostream>

#include<stdio.h>

using namespace std;

int main() {

   double a, b, c, d, e, f, x, y;

   while (cin >> a >> b >> c >> d >> e >> f) {

       x = (b*f - e * c) / (b*d - a * e);

       y = (a*f - d * c) / (a*e - b * d);

       x = int(1000 * x + 2 * (1000 * x - int(1000 * x))) / 1000.0;

       y = int(1000 * y + 2 * (1000 * y - int(1000 * y))) / 1000.0;

       printf("%.3lf %.3lf\n", x, y);

   }

}

追記 普通に%.3lfで四捨五入した形になるみたいですね。四捨五入でクソ悩んでた意味...()

*1:ここでは小数点第4位が5以上だったら繰り上がること用いて、2をかけている