题目链接
题目分析
麻烦的地方在于:输入的数会有各种格式
1、标准整数 且 截取位数少于两者
2、标准整数 但 截取位数多【补零】
3、小数 且 >1 【找到小数点位数,统计大小】
4、小数 且 <1 【直接跟在小数点后的零需要单独处理 0.00001212】
5、可能有前导零 (000.123123)
解题思路:
先表示成科学计数法,再进行比较
AC程序(C++):
/**************************
*@Author: 3stone
*@ACM: PAT-A1060
*@Time: 18/1/24 & 26
*@IDE: VS2017
***************************/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
// 处理字符串 成 科学计数法
void cleanStr(string &str, int &len, int &point) {
//消去前导0 (eg 000.122344)
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;
}