【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;
    }
}
posted @ 2021-02-26 17:35  Hyx'  阅读(51)  评论(0)    收藏  举报