一开始写的很累赘,是因为相同功能没有用函数实现
关于各个测试点:
1⃣️测试点4:
1 00.01 0.010
结果:YES 0.1*10^-1
2⃣️测试点6:有效数字不够末尾补0
5 00.01 0.0001
结果:NO 0.10000*10^-1 0.10000*10^-3
字符串最前面没用的0可以用erase去掉,注意去除后各元素位置也会移动。
#include<iostream>
#include<string>
using namespace std;
int size1=0,size2=0;
int k(string s)
{
int i,size=0;
if(s[0]=='0'&&s[1]=='.') //处理0.xxx格式的小数
{
i=2;
while(s[i++]=='0')
size--;
i--; //最后一次判断使得i指向不为0的下一位
if(s[i]=='\0') //处理0.0...0格式小数
size=0;
}
else if(s[0]=='0'&&s[1]=='\0') //处理 0
size=0;
else
{
for(i=0;i<s.size();i++) //处理xx.xxx小数或xxxxx整数
{
if(s[i]!='.')
size++;
else
break;
}
}
return size;
}
void print(string s,int a,int size)
{
int i=0;
cout<<"0.";
for(int j=0;j<a;j++)
{
if(s[i]=='.'&&s[0]!=0) //xx.xx格式小数,小数点前是有效数字
{
j--;
i++;
continue;
}
else if(s[i]!='\0')
{
if(i==0&&s[i]=='0'&&s[i+1]=='.') //0.xxx格式小数,小数点前不是有效数字
{
j--;
i=i+2;
while(s[i]=='0')
i++;
continue;
}
else
cout<<s[i++];
}
if(s[i]=='\0')
{
for(;j<a-1;j++)
cout<<0;
break;
}
}
cout<<"*10^"<<size;
}
int main()
{
int a,i=0,j=0,b=0,c=0,d=0;
string s[2];
string::iterator it;
cin>>a>>s[0]>>s[1];
it=s[0].begin();
while(s[0][i]=='0'&&s[0][i+1]!='.'&&s[0][i+1]!='\0') //去掉数字前面多余的0;
{s[0].erase(it);}
it=s[1].begin();
while(s[1][j]=='0'&&s[0][j+1]!='.'&&s[1][j+1]!='\0')
{s[1].erase(it);}
size1=k(s[0]);
size2=k(s[1]);
i=0; //判断有效数字部分是否相同
j=0;
for(int count=0;count<a;count++)
{
if(s[0][i]=='.') //遇到小数点跳过并且不算有效数字
{
i++;
count--;
continue;
}
if(s[1][j]=='.')
{
j++;
count--;
continue;
}
if(s[0][0]=='0'&&s[1][0]=='0'&&s[0][1]!=s[1][1]) //不相同的四种情况
b=1;
if(s[0][i]!='\0'&&s[1][j]!='\0'&&s[0][i++]!=s[1][j++])
b=1;
if(s[0][i]=='\0'&&s[1][j]!='0'&&s[1][j]!='\0')
b=1;
if(s[0][j]=='\0'&&s[1][i]!='0'&&s[0][i]!='\0')
b=1;
}
if(b==1||size1!=size2)
{
cout<<"NO ";
}
else
cout<<"YES ";
print(s[0],a,size1);
if(b==1||size1!=size2)
{ cout<<' ';
print(s[1],a,size2);
}
return 0;
}