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;
}
先判断有无小数点
如果无小数点,则先去除前面的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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性