PAT Advanced 1060 Are They Equal (25 )
题目描述
Input Specification:
Output Specification:
Sample Input:
Sample Output:
解题思路
超烦的一类题,消极写题然后WA到没脾气,一个地方一个地方的找bug。。
比如前缀0。。。以及00000000.0001这样的数据。。
Code
- AC代码
#include<bits/stdc++.h>
using namespace std;
string getZeros(int num) {
if(!num) return "";
return "0"+getZeros(num-1);
}
string dealPrefix0(string str) {
int i = 0;
while(i<str.length() && str[i] == '0') i++;
if(i == str.length()) return "0";
else if(str[i] == '.') return str.substr(i-1);
return str.substr(i);
}
string getStandardFormat(string str, int digits, int &e) {
str = dealPrefix0(str);
int dotIdx = str.find('.');
if(dotIdx == -1) {
//整数
if(str == "0") return getZeros(digits);
e = str.length();
return e >= digits ? str.substr(0, digits) : str+getZeros(digits-e);
} else if(dotIdx == 1 && str[0] == '0') {
//纯小数
int nonZeroIdx = 2;
while(nonZeroIdx < str.length() && str[nonZeroIdx] == '0') nonZeroIdx++;
int validCount = str.length()-1;
while(validCount>nonZeroIdx && str[validCount] == '0') validCount--;
validCount = validCount - nonZeroIdx + 1;
if(validCount > 0) {
e = 2-nonZeroIdx;
return validCount >= digits ? str.substr(nonZeroIdx, digits) : str.substr(nonZeroIdx)+getZeros(digits-validCount);
} else {
//0.0...0
return getZeros(digits);
}
} else {
//整数+小数
e = dotIdx;
if(e >= digits) {
return str.substr(0, digits);
} else {
string res = str.substr(0, dotIdx)+str.substr(dotIdx+1, str.length()-dotIdx);
return res.length() > digits ? res.substr(0, digits) : res+getZeros(digits-res.length());
}
}
}
void printFormat(string str, int e) {
cout << " 0." << str;
cout << "*10^" << e;
}
int main() {
freopen("in.txt", "r", stdin);
int digits, e1 = 0, e2 = 0;
string num1, num2;
cin >> digits >> num1 >> num2;
string format1 = getStandardFormat(num1, digits, e1);
string format2 = getStandardFormat(num2, digits, e2);
if(format1 == format2 && e1 == e2) {
cout << "YES";
printFormat(format1, e1);
} else {
cout << "NO";
printFormat(format1, e1);
printFormat(format2, e2);
}
return 0;
}