PAT A1060 Are They Equal (25point(s))

题目链接
注意点:
1.本题有前导零,即可能出现000.01和0000123.45的情况,需先去除前导零。
2.主要思路是得到浮点数的有效数部分和指数部分,如果有效数部分和指数部分都相等则相等,否则不等。
3.可能会遇到两种情况,即小于1的数和大于1的数,这决定他们的整数部分是否为0。如果整数部分不为零,则指数必然为正数,可以从高位右移到小数点或末尾来得到指数;否则指数非正,如果不为零的话可以通过右移寻找第一个非零位来得到指数。处理字符串和计算指数是同时进行的。

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int n;
string deal(string s,int &e){//对字符串进行处理,e是指数
    while(s.length()&&s[0]=='0'){//去除前导零
        s.erase(s.begin());
    }
    if(s[0]=='.'){//去除前导零后首位是小数点,说明该数小于1
        s.erase(s.begin());//去掉小数点
        while(s.length()&&s[0]=='0'){//寻找第一个非零的数
            e--;//计算指数
            s.erase(s.begin());//去掉第一个非零的数前面的所有零
        }
    }
    else{//去除前导零后不是小数点,说明该数大于1
        e++;//指数自增1
        while(e<s.length()&&s[e]!='.'){
            //寻找小数点,e既是指数又是下标
            e++;
        }
        if(e<s.length())//找到小数点要删去小数点
        s.erase(s.begin()+e);
    }
    if(s.length()==0){//处理完之后s的长度变为0,说明这个数为0
            e=0;
    }
    int num=0;
    string res;
    while(num<s.length()&&num<n){//未达到精度且还没全部输出
        res+=s[num++];//将该位数加到res末尾
    }
    while(num<n){//如果全部输出精度仍不够
        res+='0';//在末尾加0
        num++;
    }
    return res;
}
int main(){
    string a,b;
    cin>>n>>a>>b;
    int ea=0,eb=0;
    a=deal(a,ea);
    b=deal(b,eb);
    if(a==b&&ea==eb){
        cout<<"YES 0."<<a<<"*10^"<<ea;
    }
    else{
         cout<<"NO 0."<<a<<"*10^"<<ea<<" 0."<<b<<"*10^"<<eb;
    }
    return 0;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 647

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105595242