Solution:
- 题目要求:给出两个非负的小数,且都不超过10的100次方。再给出一个有效位数,将这两个小数都转化为科学计数法的形式,即0.d[1]…d[N]*10^k (d[1]>0 除非这个数是0),若转化后的两数相等,则输出“YES”,否则,输出“NO”。
- 给出的数可能包含前缀0或者后缀0,要注意去掉。
代码如下:
//模拟
#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;
}