説明:
マシンが有効数字を3桁しか保存できない場合、浮動小数点数12300と12358.9はどちらも単純なチョッピングで0.123×10 5として保存されるため、等しいと見なされます。ここで、マシンの有効桁数と2つの浮動小数点数が与えられたら、それらがそのマシンで同等に扱われるかどうかを判断するはずです。
输入力格式:
各入力ファイルには、N、A、Bの3つの数値を与える1つのテストケースが含まれます。 N(<100)は有効桁数で、AとBは比較される2つの浮動小数点数です。各浮動小数点数は負ではなく、10 100以下であり、その合計桁数は100未満です。
出力仕様:
输出力格式
各テストケースについて、2つの数値が同等に扱われる場合は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つの数値が与えられた場合、次のように質問します。等しい場合はYESを出力し、変換結果を出力し、そうでない場合はNOを出力して2つの数値の変換結果をそれぞれ出力します。
#include<iostream>
#include<string>
int n; //有效的位数
string deal(string s, int& e){
int k = 0;
while(s.length() > 0 && s[0] == '0'){
s.erase(s.begin());
}
if(s[0] == '.'){
s.erase(s.begin());
while(s.length() > 0 && s[0] == '0'){
s.erase(s.begin());
e--; //每去掉一个0,指数e减1
}
}else{ //去掉前导零后不是小数点,则找到后面的小鼠嗲删除
while(k < s.length() && s[k] != '.'){//寻找小数点
k++;
e++; //只要不喷到小数点就让指数e++
}
if(k < s.length()){
s.erase(s.begin() + k) //把小数点删除
}
}
if(s.length() == 0){
e = 0; 如果去除前导零后s的长度变为0,说明这个是0
}
int num = 0;
k = 0;
string res;
while(num < n){
if(k < s.length()) res += s[k++]; //只要还有数字,就加到res末尾
else res += '0';
num++;
}
return res;
}
int main(){
string s1,s2,s3,s4;
cin >> n >> s1 >> s2;
int e1 = 0,e2 = 0; //e1,e2为s1与s2的指数
s3 = deal(s1, e1);
s4 = deal(s2, e2);
if(s3 == s4 && e1 == e2){ //主体相同且指数相同则YES
cout<<"YES 0."<<s3<<"*10"<<e1<<endl;
}
else{
cout<<"NO 0."<<s3<<"*10"<<e1<<" 0."<<s4<<"*10"<<e2<<endl;
}
return 0;
}