yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 246 B - Get Closer

問題の要約
 二次元平面上の点(0,0)から点(A,B)に向かって距離1だけ移動する。
 移動後の座標を求めよ。
 なお、制約より点(0,0)と点(A,B)の距離は1以上であることが保証される。
制約
 入力は全て整数
 0<=A,B<=1000
 (A,B)≠(0,0)
入力
 A B
出力
 移動後の点を(x,y)とするとき、xとyをこの順に空白区切りで出力せよ。
 想定解との絶対誤差または相対誤差が10^-6以下であれば正解として扱われる。
考え方
 1,(A,B)方向に距離1移動した後の点を(A',B')とする。
  1 = sqrt(A'^2+B'^2)である。
 2,(A,B)に移動したときの距離をdとする。
  d = sqrt(A^2+B^2)である。
 3,比で考える。
  A:B:d = A':B':1より
  A:d = A':1
  B:d = B':1
   これより
  A' = A/d
  B' = B/d

実際のプログラム
#include<iostream>
#include<cmath>
#include<iomanip>

using namespace std;

int main(){
  double A,B;
  cin >> A >> B;
  
  double A_ = A / sqrt(A*A+B*B);
  double B_ = B / sqrt(A*A+B*B);
  
  cout << setprecision(15) << A_ << " " << B_ << endl;
  
  return 0;
}