【1060 25 科学记数】 Are They Equal
传送门
题意
给定两个浮点数 \(a,b\),给定保留位数 \(n\),将两个数转换为 \(0.abc \times 10^{x}\),其中 \(x\) 是给定的两个数的整数部分大小,问两个数转化为科学计数法后是否相同
数据范围
\(n\leq 100\)
\(|a,b|\leq 10^{100}\)
题解
- 用字符串存储,找出小数点和第一个非 \(0\) 整数的位置,考虑到输入没有小数点的情况设置为字符串最后位置 +1
- 通过计算小数点的位置和第一个非 \(0\) 整数的位置二者计算出指数的值,如果小数点的位置大于第一个因为是 \(0.\) 的格式所以要+1
- 没有非 \(0\) 数的时候指数为\(0\)
- 长度不够的时候后面补 \(0\),全为 \(0\) 的时候也会补
Code
#include<bits/stdc++.h>
using namespace std;
int get(string &s,string &ts,int len){
int point=s.size(),nzero=-1;
for(int i=0;i<s.size();i++){
if(s[i]=='.') point=i;
else if(nzero==-1 && s[i]!='0') nzero=i,ts+=s[i];
else if(nzero!=-1 && ts.size()<len) ts+=s[i];
}
while(ts.size()<len) ts+='0';
if(nzero==-1) return 0;
int p=point-nzero;
return p<0?p+1:p;
}
int main(){
int n; string a,b,ta="",tb="";
cin>>n>>a>>b;
int pa=get(a,ta,n),pb=get(b,tb,n);
if(pa==pb && ta==tb){
cout<<"YES 0."<<ta<<"*10^"<<pa;
} else {
cout<<"NO 0."<<ta<<"*10^"<<pa<<' ';
cout<<"0."<<tb<<"*10^"<<pb;
}
}

浙公网安备 33010602011771号