zl程序教程

您现在的位置是:首页 >  其他

当前栏目

1060 Are They Equal (25 分)【难度: 一般 / 知识点: 模拟 字符串处理】

知识点模拟 处理 字符串 25 are 一般 难度
2023-09-11 14:15:52 时间

在这里插入图片描述
https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872
细节很多,需要注意一下几个情况:

  • 12345000 全是整数的情况
  • 000012313 全是整数有前导零的情况
  • 123.456 既有整数,又有小数的情况
  • 0.00001323 只有小数的情况
  • 0 这种情况
  • 0.00000 这种情况
#include<bits/stdc++.h>
using namespace std;
int n,len1,len2;
string a,b,s1,s2;
int get(string& s,string& ans)
{
    if(s.find('.')==-1)//整数
    {
        while(s.size()>1&&s[0]=='0') s=s.substr(1);
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!='.') ans+=s[i];
            else break;
            if(ans.size()==n) break;
        }
        while(ans.size()<n) ans="0"+ans;
        if(s[0]=='0') return 0;//说明是0
        return s.size();
    }else
    {
        int k=s.find('.');
        bool flag=0;
        for(int i=0;i<k;i++) if(s[i]!='0') flag=1;//说明" .  "前边有数
        if(flag)//前整,后小数
        {
            while(s[0]=='0') s=s.substr(1);
            for(int i=0;i<s.size();i++)
            {
                if(s[i]!='.') ans+=s[i];
                if(ans.size()==n) break;
            }
            while(ans.size()<n) ans=ans+"0";
            return s.find('.');
        }else//全是小数
        {
            s=s.substr(s.find('.')-1);
            int cnt=2;
            while(s[cnt]=='0'&&cnt<s.size()) cnt++;
            for(int i=cnt;i<s.size();i++)
            {
                ans+=s[i];
                if(ans.size()==n) break;
            }
            while(ans.size()<n) ans=ans+"0";
            if(cnt==s.size()) return 0;///0.0000000这种情况
            return -(cnt-2);
        }
    }
}
int main(void)
{
    cin>>n>>a>>b;
    len1=get(a,s1);
    len2=get(b,s2);
    if(s1==s2&&len1==len2) printf("YES 0.%s*10^%d",s1.c_str(),len1);
    else printf("NO 0.%s*10^%d 0.%s*10^%d",s1.c_str(),len1,s2.c_str(),len2);
    return 0;
}