PAT甲级 1060 Are They Equal 判断两个小数是否相等

PAT甲级 1060 Are They Equal 判断两个小数是否相等

Solution:

  • 题目要求:给出两个非负的小数,且都不超过10的100次方。再给出一个有效位数,将这两个小数都转化为科学计数法的形式,即0.d[1]…d[N]*10^k (d[1]>0 除非这个数是0),若转化后的两数相等,则输出“YES”,否则,输出“NO”。
  • 给出的数可能包含前缀0或者后缀0,要注意去掉。

代码如下:

//模拟
#include<iostream>
#include<string>
using namespace std;

int n;//有效位数
string s1,s2;
pair<string,int> p;

pair<string,int> deal_string(string a){//处理输入的字符串
    if(a=="0"){
        string d="0.";
        for(int i=0;i<n;i++){
            d+='0';
        }
        int k=0;
        p.first=d;
        p.second=k;
        return p;
    }
    int left,right;//去除多余0后子串的起始位置
    int flag1=0,flag2=0;
    for(int i=0;i<a.length();i++)//去除前缀的0和后缀的0
    {
        if(!flag1&&(a[i]!='0'||(a[i]=='0'&&a[i+1]=='.'))){
            left=i,flag1=1;
        }
        if(flag2==1&&a[i]!='0'){
            right=i;
        }
        if(flag2==0){
            right=i;
        }
        if(a[i]=='.'){
            flag2=1;
        }
    }
    string c=a.substr(left,right-left+1);
    int pos1;
    for(pos1=0;c[pos1];pos1++){//找到小数点的位置
        if(c[pos1]=='.'){
            break;
        }
    }
    int pos2;
    for(pos2=0;c[pos2];pos2++){//找到第一个不是0的数字位置,即科学技术法中小数点应该放在哪个位置之前,
        if(c[pos2]!='0'&&c[pos2]!='.'){
            break;
        }
    }
    string d="0.";
    int num=0;
    for(int i=pos2;c[i];i++)
    {
        if(c[i]=='.'){
            continue;
        }
        d+=c[i];
        num++;
        if(num>=n){
            break;
        }
    }
    for(int i=0;i<n-num;i++){//补0
        d+='0';
    }

    int k=pos1-pos2;//小数点位置的变化,就是指数
    if(k<0) k++;
    p.first=d;
    p.second=k;
    return p;
}

int main(){
    cin>>n>>s1>>s2;
    pair<string,int> mm1,mm2;
    mm1=deal_string(s1);
    mm2=deal_string(s2);
    if(mm1==mm2){
        if(mm1.first=="0"&&mm1.second==0){
            cout<<"YES "<<mm1.first;
        }else{
            cout<<"YES "<<mm1.first<<"*10^"<<mm1.second;
        }
    }else{
        if(mm1.first=="0"&&mm1.second==0){
            cout<<"NO "<<mm1.first<<" ";
        }else{
            cout<<"NO "<<mm1.first<<"*10^"<<mm1.second<<" ";
        }
        if(mm2.first=="0"&&mm2.second==0){
            cout<<mm2.first;
        }else{
            cout<<mm2.first<<"*10^"<<mm2.second;
        }
    }
    return 0;
}
上一篇:PAT乙级1060


下一篇:文件上传漏洞学习