【题意】
给出两个浮点数,判断在给定的有效位数下它们是否相等
【思路】
因为数的范围很大,所以用string保存,然后删除字符串前面多余的0,计算出指数。进而将有效位数保存在两个新的字符串中,不够的位数用0补。最后比较两个有效位数字符串和阶码是否相等即可
【注意点】
这种题目一看就是在细节处有很多坑的。。。
1. 对于0, 0.0, 0.00 etc.这些需要特殊处理,即在第一遍扫描到第一个不是'0'或'.'的字符时若扫到底了,则将阶码置为0,对于这种情况有效位数都是相同个0;
2. 需要去掉前面多余的0
3. 若原来的有效位数不够需要在末尾补0
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(int argc, char const *argv[])
{
int n;
string num[2],valid[2];
int e[2]={0,0};
cin >> n >> num[0] >> num[1];
for(int i=0; i<2; i++){
//删去前面多余的0
string::iterator it;
for(it=num[i].begin(); it!=num[i].end() && *it=='0';){
num[i].erase(it);
}
int ex=0;
while(ex<num[i].length() && (num[i][ex]=='0' || num[i][ex]=='.')){
ex++;
}
if(ex==num[i].length()){
ex=0;
}
else if(ex>0){
e[i] = 1-ex;
}
else{
while(ex<num[i].length() && num[i][ex]!='.'){
ex++;
}
e[i] = ex;
}
}
for(int i=0; i<2; i++){
int index=0;
while(index<num[i].length() && (num[i][index]=='0' || num[i][index]=='.')){
index++;
}
int cnt=0;
while(index<num[i].length() && cnt<n){
if(num[i][index]=='.'){
index++;
}
else{
stringstream ss;
ss << num[i][index++];
valid[i].append(ss.str());
cnt++;
}
}
//原本有效位数不够,需要补0
while(cnt<n){
valid[i].append("0");
cnt++;
}
}
if(valid[0]==valid[1] && e[0]==e[1]){
cout << "YES";
cout << " 0." << valid[0] << "*10^" << e[0];
}
else{
cout << "NO";
for(int i=0; i<2; i++){
cout << " 0." << valid[i] << "*10^" << e[i];
}
}
system("pause");
return 0;
}