1060 Are They Equal (25 分)
题意:一个机器只能有n位有效位,给出两个浮点数,求出这两个浮点数的科学计数法(保留n位有效数字),并求出这两个数的保留n位有效数字的科学计数表示是否相同。 思路:参考《算法笔记》,需要用到STL中的string知识(现在才知道原来string是STL中的,而且string很多语法之前都没有用过)。 step1:给出的数分两种可能,①0.a1a2a3…②b1b2—bm.a1a2a3…(b1不为零)对这两种输入情况分别进行科学计数就可以了,但需要注意,还有一个潜在的坑:输入可能是0000.123或000123.56,就是说可能会有无效的前导零存在,那么首先在输入时就要去掉无效的前导零。按第一位是否是小数点来判断输入的数属于①还是②。 step2:对于①来说,把小数点,小数点后的零都删去,只保留第一个有效的数,同时小数点后零的个数即为指数(的相反数)。 step3:对于②来说,把小数点删去,第一个有效数到小数点前的位数即为指数。 代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
string s1, s2;
int e1= 0 , e2= 0 ;
string deal ( string s, int & e)
{
int k= 0 ;
while ( s[ 0 ] == '0' && s. length ( ) > 0 )
{
s. erase ( s. begin ( ) ) ;
}
if ( s[ 0 ] == '.' )
{
s. erase ( s. begin ( ) ) ;
while ( s. length ( ) > 0 && s[ 0 ] == '0' )
{
s. erase ( s. begin ( ) ) ;
e-- ;
}
}
else
{
while ( s. length ( ) > k&& s[ k] != '.' )
{
k++ ;
e++ ;
}
if ( k< s. length ( ) )
{
s. erase ( s. begin ( ) + k) ;
}
}
if ( s. length ( ) == 0 )
e= 0 ;
int num= 0 ;
k= 0 ;
string res;
while ( num< n)
{
if ( k< s. length ( ) ) res+ = s[ k++ ] ;
else res+ = '0' ;
num++ ;
}
return res;
}
int main ( )
{
string s3, s4;
cin>> n>> s1>> s2;
s3= deal ( s1, e1) ;
s4= deal ( s2, e2) ;
if ( s3== s4&& e1== e2)
printf ( "YES 0.%s*10^%d\n" , s3. c_str ( ) , e1) ;
else
{
printf ( "NO 0.%s*10^%d 0.%s*10^%d\n" , s3. c_str ( ) , e1, s4. c_str ( ) , e2) ;
}
}