您的位置:首页 > 编程语言 > C语言/C++

1060. Are They Equal (25)

2016-02-26 15:40 363 查看
    情况比较多,想比较快速做出来还是有难度的,索性将所有情况一一列举

先判断有无小数点
如果无小数点,则先去除前面的0,再做处理;
如果有小数点,则分为 left 与 right 两部分,再做细分处理
#include <iostream>
#include <cstdio>

using namespace std;

pair<string,int> process(string s, int n){
auto pos = s.find('.');

if(pos == string::npos){ // No dot
auto p = s.find_first_not_of('0');

if(p == string::npos){ // No dot && all of "0"
s = "0";
while(s.size() < n) s += "0";
return make_pair("0."+s, 0);
}else{ // No dot && exists non-"0"
s = s.substr(p);
int len = (int)s.size();
s = s.substr(0, n);
while(s.size() < n) s += "0";

return make_pair("0."+s, len);
}
}else{ // has dot
string left = s.substr(0, pos), right = s.substr(pos+1);
auto p = left.find_first_not_of('0');

if(p == string::npos){ // has dot && left is "0"
auto i = right.find_first_not_of('0');

if(i == string::npos){ // has dot && left is "0" && right is "0"
s = "0";
while(s.size() < n) s += "0";
return make_pair("0."+s, 0);
}else{ // has dot && left is "0" && right is not "0"
right = right.substr(i, n);
while(right.size() < n) right += "0";

return make_pair("0."+right, -i);
}
}else{ // has dot && left is not "0"
left = left.substr(p);
int len = (int)left.size();

if(len >= n){ // has dot && left is not "0" && left size >= n
left = left.substr(0, n);
return make_pair("0."+left, len);
}else{ // has dot && left is not "0" && left size < n
left += right.substr(0, n-len);
return make_pair("0."+left, len);
}
}
}
}

int main(){
int n;
string a, b;
cin >> n >> a >> b;

auto reta = process(a, n);
auto retb = process(b, n);

if(reta.first == retb.first && reta.second == retb.second){
printf("YES %s*10^%d", reta.first.c_str(), reta.second);
}else{
printf("NO %s*10^%d %s*10^%d", reta.first.c_str(), reta.second, retb.first.c_str(), retb.second);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ PAT Are They Equal