#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct SCINUM { // 科学计数法结构体
string valid_num; //有效位
int index;//指数
SCINUM() {
index = 0; // 10^index
}
};
//将string表示的浮点数转化为科学表示法的数值
//valid_cnt保留的有效位数
SCINUM str2Sci(string num, int valid_cnt) {
SCINUM scinum;
int dot_pos, nzero_pos; // dot_pos:小数点位置、 nzero_pos:第一个非零数值的位置
//找到小数点的位置
dot_pos = num.find(".");
if (dot_pos == string::npos)//没有小数点,小数点就在最后一个位置
dot_pos = num.size();
//找到第一个非零数字的位置
nzero_pos = 0;
while (nzero_pos < num.size() && (num[nzero_pos] == '0' || num[nzero_pos] == '.'))
nzero_pos++;
//如果上面找到的都是0,那么这是数是零,可以直接返回
if (nzero_pos == num.size()) {
while (scinum.valid_num.size() < valid_cnt)//在后面补够有效位数
scinum.valid_num.push_back('0');//补‘0’
return scinum; //返回
}
//求出小数点需要移动的位数,即求指数的大小
scinum.index = dot_pos - nzero_pos;//小数点位置-非零数值的位置
if (dot_pos < nzero_pos)scinum.index++;
//把有效位存储到scinum里面的valid_num
for (int i = nzero_pos; i < num.size() && scinum.valid_num.size() < valid_cnt; i++) {
if (num[i] != '.')scinum.valid_num += num[i];
}
//补‘0’,筹够有效位数
while (scinum.valid_num.size() < valid_cnt)
scinum.valid_num.push_back('0');
return scinum;
}
PAT题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872
int main() {
string str1, str2;
int cnt;
cin >> cnt >> str1 >> str2;
SCINUM scinum1, scinum2;
scinum1 = str2Sci(str1, cnt);
scinum2 = str2Sci(str2, cnt);
if (scinum1.valid_num == scinum2.valid_num && scinum1.pow == scinum2.pow) {
printf("YES 0.%s*10^%d\n", scinum1.valid_num.c_str(), scinum1.pow);
}
else {
printf("NO 0.%s*10^%d 0.%s*10^%d\n", scinum1.valid_num.c_str(), scinum1.pow, scinum2.valid_num.c_str(), scinum2.pow);
}
return 0;
}