真让人秃顶
这个题情况太复杂,有两个数据没通过,实在不想debug了。
错的原因,包括不限于下面这种情况(如图),本来应该是输出YES的。
#include<iostream>
#include<string>
using namespace std;
int n,Min,cnt1,cnt2;
string str1,str2,s1,s2;
bool flag=true;
bool flag1=true;
bool flag2=true;
string deal(string a)
{
while(a[0]=='0')
{
a.erase(a.begin());
if(!flag)//已经消除了小数点
{
if(!flag1) cnt1--;
if(!flag2) cnt2--;
}
}
return a;
}
int main()
{
cin>>n>>str1>>str2;
//去掉前导0
str1=deal(str1);
str2=deal(str2);
//得到每个字符串的整数位的个数,并去掉小数点。
string::iterator it;
it=str1.begin();
for(int i=0;i<str1.length();i++)
if(str1[i]!='.') { cnt1++; it++; }
else { str1.erase(it);break; }
it=str2.begin();
for(int j=0;j<str2.length();j++)
if(str2[j]!='.') { cnt2++; it++; }
else { str2.erase(it);break;}
//已经消除了小数点
flag=false;
flag1=false;//开始改串1。
str1=deal(str1);
flag1=true;
flag2=false;//串1修改完毕,开始改串2
str2=deal(str2);
//使两个字符串的长度最小为机器的有效长度
while(str2.length()<n) str2+="0";
while(str1.length()<n) str1+="0";
//
s1=str1.substr(0,n);
s2=str2.substr(0,n);
//
if(s1==s2&&cnt1==cnt2)
{
cout<<"YES 0."<<s1<<"*10^"<<cnt1;
}
else
{
cout<<"NO 0."<<s1<<"*10^"<<cnt1<<" 0."<<s2<<"*10^"<<cnt2;
}
return 0;
}
这个题的思路:
比较科学计数法,就是比较小数部分和指数部分是否相等。