题目难度:三颗星
题目大意:给出两个数,需要写出其科学计数法,并保留给定的位数,最后判断两个数是否相等。
题目坑点:老实说,写了半天 写错了,然后,没办法看了算法笔记的答案,只能说 思维还不够。
思路:对于输入的小数,可以分成0.。。。。和整数.小数两种,第一种和第二种的情况都需要:利用循环去掉数值开始前的零的元素。如果去除零之后紧跟着的是小数点,那么就是零点多少的形式,那么就开始数小数点之后的零的个数,每有一个零 就是10的负多少次方;如果去除先导零之后不是小数点,那么就要看整数部分距离小数点有几位,就循环找小数点,退出循环之后,如果k的定位是小于原来的长度的,那么就删除掉小数点。
需要注意的是,在去除掉小数点之后,需要判断第一种情况中的,去掉零之后是否就完全都没有了,那么此时的e指数就是0,而不是负数。
最后开始将科学计数法的小数部分堆起来,如果上面剩下的数字还有就加上去,如果没有,那么就加上0,保留精度。
希望之后再回顾一下,这种题目,其实没啥难度,但是可能程序写的不好就变得很复杂,类似于模拟题,难在逻辑。
代码如下:
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
int N;
string to_form(string A,int &e){
int k=0;
while(A.length()>0&&A[0]=='0')
A.erase(A.begin());
if(A[0]=='.'){
A.erase(A.begin());
while(A.length()>0&&A[0]=='0'){
A.erase(A.begin());
e--;
}
}
else{
while(k<A.length()&&A[k]!='.'){
e++;
k++;
}
if(k<A.length())
A.erase(A.begin()+k);
}
if(A.length()==0){
e=0;
}
int num=0;
k=0;
string res;
while(num<N){
if(k<A.length())
res+=A[k++];
else
res+="0";
num++;
}
return res;
}
int main(){
string A,B;
cin>>N>>A>>B;
int e1=0,e2=0;
A=to_form(A,e1);
B=to_form(B,e2);
if(A==B&&e1==e2){
cout<<"YES 0."<<A<<"*10^"<<e1<<endl;
}
else{
cout<<"NO 0."<<A<<"*10^"<<e1<<" 0."<<B<<"*10^"<<e2<<endl;
}
}