题目大意:
给出两个数字,把它们写成保留N位小数的科学计数法,判断两者是否相等。如果相等,则输出YES,同时写出科学计数法表示的形式;如果不相等,则输出NO,同时写出两个数字的科学计数法表示形式。
例如 12300和12358.9保留3位有效数字的科学计数法为0.123*10^5,输出YES;
而120和128保留3位有效数字的科学计数法分别为0.120*10^3和0.128*10^3,输出NO。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int n_bit; //保留有效数字的位数
int e_number; //科学计数法指数
string str1, str2; //输入的两个字符串
struct Number{ //定义科学计数法结构体
string signNumber; //有效数字
int eNumber; //指数
Number(){ //初始化
signNumber = '0';
eNumber = 0;
}
};
void dealString(string str, Number &number){
//处理有效数字,使得符合位数要求
int len = str.length();
if(len < n_bit){
for(int i = 0; i < n_bit - len; i++){
str = str + '0';
}
}else{
str.erase(n_bit,len);
}
str = "0." + str;
number.signNumber = str;
}
void dealLitter(string str, Number &number){
//处理比1小的
e_number = 1;
string::iterator it = str.begin();
while(*it == '.' || *it == '0'){
str.erase(it);
e_number--;
}
if(str.length() == 0){
e_number = 0;
}
number.eNumber = e_number;
dealString(str, number);
}
void dealBigger(string str, Number &number){
//处理比1大的
e_number = 0;
string::iterator it = str.begin();
for(; it != str.end(); it++){
if(*it == '.'){
str.erase(it);
break;
}
e_number++;
}
number.eNumber = e_number;
dealString(str, number);
}
void isBiggerThanOne(string str, Number &number){
//判断输入的数比1大还是小
string::iterator it = str.begin();
while(*it == '0'){
str.erase(it); //删掉小数点前的前导0
}
if(str.length() == 0){
number.eNumber = 0;
dealString(str, number);
}else{
if(*it == '.'){ //假如是小于1,则删掉前导0,小数点,第一个非0前的所有0
dealLitter(str, number);
}else{ //假如是大于1,则删掉前导0
dealBigger(str, number);
}
}
}
void Print(int flag, Number num1, Number num2){
//格式化输出
if(flag == 1){
printf("YES ");
cout<<num1.signNumber;
cout<<"*10^";
cout<<num1.eNumber<<endl;
}else{
printf("NO ");
cout<<num1.signNumber;
cout<<"*10^";
cout<<num1.eNumber<<" ";
cout<<num2.signNumber;
cout<<"*10^";
cout<<num2.eNumber<<endl;
}
}
void strCompare(Number num1, Number num2){
//判断两个字符串是否相等
if(num1.signNumber == num2.signNumber){
if(num1.eNumber == num2.eNumber){
Print(1,num1,num2);
}else{
Print(0,num1,num2);
}
}else{
Print(0,num1,num2);
}
}
int main(){
scanf("%d", &n_bit);
Number num1, num2;
cin>>str1>>str2;
isBiggerThanOne(str1, num1);
isBiggerThanOne(str2, num2);
strCompare(num1,num2);
return 0;
}