科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9]
.
[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
输入格式:
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
输出格式:
对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。
输入样例 1:
+1.23400E-03
输出样例 1:
0.00123400
输入样例 2:
-1.2E+10
输出样例 2:
-12000000000
一开始想着早上随便做一点的,结果这道题花了我一早上。一开始没想好具体的实现逻辑就开始写了,导致最后写不下去了。下次写之前一定要构思好实现的逻辑,对于这道题:
//n为xxx,e为xx。分别表示子串和指数(不包括正负号)
//1.如果指数小于0,则只需要在小数点后添加指数的绝对值个0
//2.如果指数大于0,若指数大于子串长度,则需要在后面补多余的0,若指数小于子串长度,则在子串中对应位置加小数点。
具体实现过程中还包括不同情况下要不要stoi(),去除最前面的一排0的问题
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int main(){
string n,e,s;
bool neg_n=0,neg_e=0;
cin>>s;
int index = s.find("E"); //index表示E的位置
int i; //spot表示输出时候小数点的位置,number_length表示最后输出数字的长度
//检测n和e的正负号
if(s[0]=='-'){
neg_n = 1;
}
if(s[index+1]=='-'){
neg_e = 1;
}
//substr表示截取原串在某下标上长度为xx的一个子串
n = s.substr(1,1)+s.substr(3,index-3);
e = s.substr(index+2,s.length()-index-1);
// cout<<"n:"<<n<<" e:"<<e<<endl;
//首先看n带不带负号,带的话直接输出一个负号
if (neg_n){
cout<<"-";
}
//然后判断e带不带负号,带的话输出e数量的一串0
if (neg_e){
cout<<"0.";
for(i=0;i<stoi(e)-1;i++){
cout<<0;
}
cout<<n;
}
//如果e是正的,就直接输出n
else{
//如果n的长度小于等于e的大小,不用输出小数点
if(stoi(e)>=n.length()-1){
cout<<stoi(n);
for(i=0;i<stoi(e)-n.length()+1;i++){
cout<<0;
}
}
else{
string pre_half = n.substr(0,stoi(e)+1);
cout<<stoi(pre_half);
cout<<".";
string last_half = n.substr(stoi(e)+1,n.length()-1);
cout<<last_half;
}
}
return 0;
}