一、思路
STEP1:使用字符串存储给定的数
无法使用整型求解,会因为输入数超出整型范围无法表示,出现测试点5错误;
STEP2:规范化表示,即确定指数位和有效位
1、找到数字中小数点的下标,并删除小数点;
2、找到第一个有效位的小标(若下标指向数字尾部,说明数字为0)
3、此时发现,指数位即:小数点下标 - 删除小数点后第一个有效位下标
此时注意:若数字为0,则指数位应为0,否则会出现测试点6错误,如0.000会得到错误结果:0.000*10^3;
4、使用string库中的substr()函数,截取N位有效位,若不足N位则补0;
注:substr(下标, 长度),返回从下表开始给定长度的子串。
ans[i] = num[i].substr( first, N );
while( ans[i].size() < N )
ans[i] += "0";
二、代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
int N, k[2];
cin >> N;
string ans[2], str;
for( int i = 0, first, point; i < 2; ++i )
{
cin >> str;
point = str.find(".");
if( point == -1 )
point = str.size();
else str.erase(point, 1);
for( first = 0; str[0] == '0'; ++first )
str.erase(0, 1);
if( !str.size() )
k[i] = 0;
else k[i] = point - first;
ans[i] = str.substr(0, N);
while( ans[i].size() < N )
ans[i] += '0';
}
if( ans[0] == ans[1] && k[0] == k[1] )
cout << "YES 0." + ans[0] + "*10^" << k[0] << endl;
else cout << "NO 0." + ans[0] + "*10^" << k[0] << " 0." + ans[1] + "*10^" << k[1] << endl;
}