1024 科学计数法
题意描述
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
输入输出格式
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。
数据规模
该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
算法设计
题意即为给一个科学计数法表示的数,要将这个数按普通表示法表示。思路如下:
- 确定
E
的位置 以E
的位置做划分 得到在科学计数法表示的情况下,该数的数字部分num
和exp
- 根据
exp
的正负来分类 若exp
为负 那结果一定是0.xxx
那我们可以先输出0.
再输出exp-1
个0
再将原来的数字部分去除小数点,输出即可。 - 若
exp
为 0 那直接输出数字部分num
即可。 - 若
exp
为正 小数点向右移动exp
位 若exp
小于num.size()-2
显然 小数点是在输出数字的内部 那就先输出num[0
再输出num[2 - 2+exp -1]
再输出小数点 最后输出 剩余数字部分 - 那若
exp
等于num.size() -2
此时小数点是不需要输出的 直接将num
的小数点去掉 输出即可 - 那若
exp
大于num.size() -2
此时小数点也是不需要输出的 直接去掉num
的小数点 输出 再输出exp -(num.size()-2)
个0 即可
c++代码
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
string stri;
cin>>stri;
if(stri[0] == '-') cout<<"-";
gg pos = stri.find('E');
string num = stri.substr(1,pos-1); // 数字部分
gg exp = stoi(stri.substr(pos+1)); // 指数部分
if(exp < 0){
cout<<"0.";
for(gg i=0;i<exp-1;i++) cout<<"0";
cout<<num[0]<<num.substr(2);
}else if(exp > 0){
if(exp < num.size()-2){
cout<<num[0]<<num.substr(2,exp)<<"."<<num.substr(2+exp);
}else if(exp > num.size() -2){
cout<<num[0]<<num.substr(2);
gg len = num.size();
for(gg i=0;i<exp-(len -2 );i++) cout<<"0";
}else {
cout<<num[0]<<num.substr(2);
}
}else cout<<num;
return 0;
}