PAT甲级 1060 Are They Equal 判断两个小数是否相等

📅 2026/7/28 16:42:04 👁️ 阅读次数 📝 编程学习
PAT甲级 1060 Are They Equal 判断两个小数是否相等

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;intn;//有效位数string s1,s2;pair<string,int>p;pair<string,int>deal_string(string a){//处理输入的字符串if(a=="0"){string d="0.";for(inti=0;i<n;i++){d+='0';}intk=0;p.first=d;p.second=k;returnp;}intleft,right;//去除多余0后子串的起始位置intflag1=0,flag2=0;for(inti=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);intpos1;for(pos1=0;c[pos1];pos1++){//找到小数点的位置if(c[pos1]=='.'){break;}}intpos2;for(pos2=0;c[pos2];pos2++){//找到第一个不是0的数字位置,即科学技术法中小数点应该放在哪个位置之前,if(c[pos2]!='0'&&c[pos2]!='.'){break;}}string d="0.";intnum=0;for(inti=pos2;c[i];i++){if(c[i]=='.'){continue;}d+=c[i];num++;if(num>=n){break;}}for(inti=0;i<n-num;i++){//补0d+='0';}intk=pos1-pos2;//小数点位置的变化,就是指数if(k<0)k++;p.first=d;p.second=k;returnp;}intmain(){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;}}return0;}