1060 Are They Equal (25 分)
题目思路
科学计数法,保留三位有效数字,看是否相等。
-
首先把每一个数字转化为科学计数法
-
首先找到小数点,指数为小数点所在的位置k,同时去除小数点
-
接着,检查第一个数字是不是0,如果是0不符合科学计数法,就把k–(相当有效位扩大
-
接下来就是讨论总体长度与有效位的大小,如若小了就进行截取
-
如果大了就是用0填充
-
最后比较这两个是否相等
相关知识点
补充0填充
basicString=basicString+string(n-basicString.length(),'0');
字符串截取
basicString=basicString.substr(0,index)+basicString.substr(index+1);
第一个是index,第二个是截取的长度
代码复现
#include <iostream>
#include "cstdio"
#include "algorithm"
#include "cstring"
#include "map"
//坑点
//注意一个case里面有多组样例,请用循环处理输入
using namespace std;
const int N=100010;
string change(string basicString, int n);
int main() {
int n;
string s1,s2;
cin>>n>>s1>>s2;
string a =change(s1,n);
string b= change(s2,n);
if(a==b){
cout<<"YES"<<" "<<a;
} else{
cout<<"NO"<<" "<<a<<" "<<b;
}
return 0;
}
string change(string basicString, int n) {
// 1.寻找到。
int index=basicString.find('.');
if(index==-1){
// 说明没有,那就在最后免加一个点,再次寻找
basicString = basicString+'.';
index=basicString.find('.');
}
basicString=basicString.substr(0,index)+basicString.substr(index+1);
// 记住还要清楚小数点
// 2.便利当前第一个值由多少个0
while (basicString.length()>0&&basicString[0]=='0'){
basicString=basicString.substr(1);
// 截取1到n的字符串,去除0位置
index--;
// 同时10次方减1
}
// 这是0
if (basicString.empty()){
index=0;
}
// 3.位数不够就补充0
if(n>basicString.length()){
// basicString=basicString+string('0',n-index);
basicString=basicString+string(n-basicString.length(),'0');
} else{
basicString=basicString.substr(0,n);
}
// 这里就显示出来有多少位
return "0."+basicString+"*10^"+to_string(index);
}