1060 Are They Equal
大致题意就是给出两个浮点数A,B,首先把它们按 0.(有效数字)*10^(指数) 表示,并且都保留N位有效数字。
最后判断A,B是否相等。
有效数字是指从左边第一个不是0的数开始计数。如果长度不够,则末尾补零。
假设下面的浮点数都保留三位有效数字
00.00123表示为0.123*10^(-2)
000012.3表示为0.123*10^(2)
00.0 表示为0.000*10^(0)。
/*STL使用的注意点
vector,string,set,map可以根据指向某个元素的迭代器it,删除这个元素。
set可以根据某个元素的值删除这个元素。
map可以根据某个元素的键删除这个元素。
*/
#include"iostream" #include"algorithm" using namespace std;
int n;//有效数字位数 string deal(string s,int& e) {//处理浮点数,得到有效数字,以及指数 while(s.length() > 0 && s[0] == '0') { //删除前导零 s.erase(s.begin()); } //如果删除前导零以后的字符串的第一个字符是小数点,那么继续删除非零数前面的前导零,并且每删除一个前导零,指数减一 //如00.00123 if(s[0] == '.') { //删除这个小数点 s.erase(s.begin()); while(s.length() > 0 &&s[0] == '0') { s.erase(s.begin()); e--; } } else { //如000012.3, int k = 0; for(k; k < s.length(); ++k) {//查找小数点,并且指数++ if(s[k] == '.') break; else e++; } if( k < s.length()) { //找到小数点就删除 s.erase(s.begin()+k); } } //如果删除所有前导零,结果为0,如0000.000,那么指数为0,有效位数为 0.0(...) if(s.length() == 0) { e = 0; } //比如00.00123,经过前面处理以后成为123,保留4位有效数字 s = s.substr(0,n);//substr(pos,len);结果还是123 int len = n - s.length(); while(len--) { s+='0';//有效位不足,末尾补零 } return s; } int main() { int e1 =0 ,e2 = 0;//初始指数为0 scanf("%d",&n); string s1,s2; cin>>s1>>s2; s1 = deal(s1,e1); s2 = deal(s2,e2); if(s1 == s2 && e1 == e2) {//如果两个浮点数的有效位数和指数数值相同,那么它们等价 printf("YES 0.%s*10^%d",s1.c_str(),e1); } else { printf("NO 0.%s*10^%d 0.%s*10^%d",s1.c_str(),e1,s2.c_str(),e2); } return 0; }