如果机器只能保存 33 个有效数字,则将浮点数 1230012300 和 12358.912358.9 视为相等(多余位数直接舍弃,不进行四舍五入),因为它们都保存为 0.123×1050.123×105。
现在给定一个机器能够保存的有效数字位数,以及两个浮点数,请你判断两个数在该机器上是否相等。
注意:
数字不一定标准,可能有前导 00。
如果数值是0,则指数规定为0。
输入格式
共一行,包含三个数 N,A,BN,A,B,分别表示有效位数,以及两个用来比较的浮点数。
输出格式
共一行,如果两个数相等,则先输出 YES,然后输出它们共同的保存方法,格式为 0.d[1]…d[N]*10^k(d[1] > 0,除非数字为 00)。
如果两个数不相等,则先输出 NO,然后分别输出两个数的保存方法,格式同上。
数据范围
1≤N<1001≤N<100,
AA 和 BB 都不大于 1010010100,且总位数不超过 100100。
输入样例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个测试用例
输入
2 0.000001 0.1
标准答案
NO 0.10*10^-5 0.10*10^0
输入
6 12300 12358.9
输出
NO 0.123000*10^5 0.123589*10^5
#include<bits/stdc++.h>
using namespace std;
int n;//有效位数
string tostring(int k){ //int转化成string
string t;
stringstream input;
input<<k;
input>>t;
return t;
}
string change(string s){
int k=s.find('.');//K的数值就是10的几次方
if (k == -1) s += '.', k = s.find(".");//没有小数点后面加一个
s=s.substr(0,k)+s.substr(k+1);//去除小数点
while (s.size() && s[0] == '0') s = s.substr(1), k -- ;//取出前导零
if (s.empty()) k = 0;//如若为零,K为0
if(s.size()>n)s = s.substr(0, n);
else s=s+string(n-s.size(),'0');//补零
return "0." + s + "*10^" + tostring(k);
}
int main()
{
cin>>n;
string a,b;
cin>>a>>b;
a=change(a);
b=change(b);
if(a==b)
cout<<"YES"<<' '<<a<<endl;
else
cout<<"NO"<<' '<<a<<' '<<b<<endl;
return 0;
}