マシンはわずか3桁を保存することができた場合、彼らは両方として保存されるため、フロート番号12300と12358.9が等しいと見なされます 簡単なチョッピング。今のマシンと2つのfloat数値の有効桁数を与え、あなたは彼らがそのマシンで同等に扱われている場合伝えることになっています。
入力仕様:
各入力ファイルには、3つの数字を与える一つのテストケースが含まれています 、 と 、 有効桁数であり、そして と 比較される2つの浮動小数点数です。各フロート数は負でない、より大きくないです 、及びその総桁数が100未満です。
出力仕様:
各テストケースのために、線で印刷YES
二つの数字が同じに扱われた場合、次いで、標準的な形で数0.d[1]...d[N]*10^k
(d[1]
> 0の数が0でない限り)。またはNO
彼らは標準的な形式で、2つの数を等しく処理し、されていない場合。すべての用語は、行の末尾に余分なスペースを、スペースで区切らなければなりません。
注:単純なチョッピングは丸めずに想定されます。
サンプル入力1:
3 12300 12358.9
サンプル出力1:
YES 0.123*10^5
サンプル入力2:
3 120 128
出力例2:
NO 0.120*10^3 0.128*10^3
問題の意味
2つの数値を与え、Nビットの指数表記を予約して出力します。
タイトルを保持有効数字を記述することを注意切り上げで直接カット、ではなく、4つのバンカーの丸めです。
思考
問題の標準的な形態であり0.d[1]...d[N]*10^k
、書き込み= S d[1]...d[N]
、次いで、単にS kが全て等しく、我々は2つの浮動小数点数は、標準形式が等しいと結論付けることができます。
コード
#include <iostream>
#include <string>
using namespace std;
int removeLeadingZero(string &s) {
int i = 0;
while (i < s.length() and s[i] == '0')
++i;
s = s.substr(i);
return i;
}
string deal(string a, int n, string &s, int &k) {
k = 0;
s = "";
removeLeadingZero(a);
if (a.length() > 0 && a[0] == '.') {
a.erase(a.begin());
k -= removeLeadingZero(a);
} else {
int i = 0;
while (i < a.length() and a[i] != '.')
++i;
k += i;
if (i < a.length())
a.erase(a.begin() + i);
}
if (a.length() == 0)
k = 0;
for (int i = 0, j = 0; i < n; ++i) {
if (j < a.length())
s += a[j++];
else
s += '0';
}
return s;
}
int main() {
int k1, k2, n;
string a, b, s1, s2;
cin >> n >> a >> b;
deal(a, n, s1, k1);
deal(b, n, s2, k2);
if (s1 == s2 && k1 == k2)
cout << "YES 0." << s1 << "*10^" << k1 << '\n';
else
cout << "NO 0." << s1 << "*10^" << k1 << " 0." << s2 << "*10^" << k2 << '\n';
}