其他分享
首页 > 其他分享> > PAT甲级 1060 Are They Equal 判断两个小数是否相等

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

作者:互联网

在这里插入图片描述

Solution:

代码如下:

//模拟
#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,string,deal,int,1060,s1,mm1,Equal,s2
来源: https://blog.csdn.net/weixin_44123362/article/details/100181333