1060 Are They Equal (25 分)难度: 一般 / 知识点: 模拟 字符串处理
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1060 Are They Equal (25 分)难度: 一般 / 知识点: 模拟 字符串处理相关的知识,希望对你有一定的参考价值。
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;
}
以上是关于1060 Are They Equal (25 分)难度: 一般 / 知识点: 模拟 字符串处理的主要内容,如果未能解决你的问题,请参考以下文章
PAT Advanced 1060 Are They Equal (25分)
1060 Are They Equal (25 分)难度: 一般 / 知识点: 模拟 字符串处理
PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)