思路:
1、先表示成科学计数法,再进行比较
2、分为 > 1 和 < 1 分类处理
/**************************
//@Author: 3stone
//@ACM: PAT-A1060
//@Time: 18/1/24
//@IDE: VS2017
***************************/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
// 处理字符串
void cleanStr(string &str, int &len, int &point) {
//消去前导0
while (str[0] == '0' && str[1] != '.') {
str.erase(0, 1);
len--; point--;
}
if (str[0] == '0') { // < 1 (纯小数)
point = 0;
if (str != "0") {
while (str[2] == '0') {
str.erase(2, 1);//移除小数点后多余0
point--;
len--;
}
str.erase(0, 2);//只保留小数部分
len -= 2;
}
if (str == "") { str = "0"; point = 0; } // 可能有 0.000 这种
}
else { // > 1
str.erase(point, 1);
len--;
}
}
int main() {
int n;
string str1, str2;
cin >> n;
cin >> str1 >> str2;
int len1 = str1.size();
int len2 = str2.size();
int point_1 = str1.find(".");//小数点的位置,即整数部分的位数
int point_2 = str2.find(".");
if (point_1 == string::npos) point_1 = len1;
if (point_2 == string::npos) point_2 = len2;
//处理字符串
cleanStr(str1, len1, point_1);
cleanStr(str2, len2, point_2);
//要考虑到 有效位 比 n 小的情况,补0
while (len1 < n) { str1 += '0'; len1++; }
while (len2 < n) { str2 += '0'; len2++; }
//截取所需有效位
string temp_1 = str1.substr(0, n);
string temp_2 = str2.substr(0, n);
//判 等
bool equalOrNot = true;
if (temp_1 != temp_2 || point_1 != point_2) equalOrNot = false;
//输出
if (equalOrNot)
cout << "YES 0." << temp_1 << "*10^" << point_1 << endl;
else
cout << "NO 0." << temp_1 << "*10^" << point_1 << " 0." << temp_2 << "*10^" << point_2 << endl;
system("pause");
return 0;
}