問題レポートにGDUT_冬季訓練ソリューション_問題レポートに話題I_J個人の問題解決
Jタイトル:バイナリ浮動小数点数
トピック:
N細いロッドの長さLが加熱されると、それは新しい長さL「= Cの熱膨張係数(1 + N * C)* L、に展開します。
細い棒が2つの固体の壁に取り付けられ、その後、加熱されたとき、それは円形のセグメントを形成し、拡大し、元のバーのセグメントのコードは、コードセグメントです。
あなたの仕事は、ロッドの変位の中心からの距離を計算することです。
エントリー
入力は複数の行が含まれています。ロッド(MM)、温度(度)との熱膨張係数の初期長さ:各行は3つの非反転入力を含んでいます。入力データは、その元の長さの拡張ロッドのせいぜい半分を確保します。最後の行は、それが扱われるべきではない、3つの負の入力が含まれています。
輸出
各入力ライン、出力ラインのために、前記センターはミリメートルでロッド変位、および3桁の精度を含みます。
トピック上の観点から、Lが長い棒で、そしてその後、彼は高いアーチの高さを聞いて、加熱された 'L'があるでしょう、私たちは簡単に物理学の知識に来ることができ、この弧は、すべての後、2に沿って与えられたアークタンジェントであります力のバランスによって、どこにでも始めます。
問題は、に縮小される:セクタL 'の弧の長さに対応する、翼弦長L見つけ、R-は、翼弦長に対して垂直にその中心を見つけます。
:この問題は、直接私たちは効果的な方法、表現の唯一の多くを見つけるように見えることはありませんが、答えはそれを行うことができます正しいかどうかを確認達成するならば、我々は時間半の結果使用
R hにそれぞれ対応し、セクタ角度アルファ:
コード:
using namespace std;
double L,N,C;
int main()
{
while(~scanf("%lf %lf %lf",&L,&N,&C) && L>=0 && N>=0 && C>=0)
{
//h的范围:0——L/2;
double left=0,right=L/2;
double L1=(1+N*C)*L;
while(right-left>=1e-8)
{
double mid=left+(right-left)/2;
double R=mid/2+L*L/8/mid;
double Alpha=asin(L/(R*2));
if(L1>2.0*R*Alpha)
{//h小了,应该往上取
left=mid;
}
else right=mid;
}
printf("%.3f\n",left);
}
return 0;
}