题目:编写程序按普通数字表示法输出以科学计数法的格式给出的实数A。
输入格式:
一个以科学计数法表示的实数A。
输出格式:
按普通数字表示法输出A。并保证所有有效位都被保留,包括末尾的0。
思路:首先找出小数点的位置、确定指数的大小。然后将小数点根据指数的值向前或向后移动。注意,向前移动时,需要在前面补零,向后移动时,需要在后面补零。
代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;cin >> s;
int posE = -1,posD = 1;
for(unsigned int i = 1 ; i < s.size() ; i ++){
if(s[i] == '.') posD = i; // .所在的下标
if(s[i] == 'E'){
posE = i; // E所在的下标
break;
}
}
string xishu = s.substr(1,posD-1) + s.substr(posD+1,posE-posD-1);posD -= 1;
int zhishu = stoi(s.substr(posE+1,s.size()-posE-1));
posD = posD + zhishu; // 小数点向前或向后移
if(s[0] == '-') cout << s[0];
if(posD >= 0){
if(posD == 0) // 小数点在第零号位置时需输出前导零
cout << "0";
int len = xishu.size();
for(int i = 0 ; i < len ; i ++){ // 输出系数和小数点
if(i == posD)
cout << ".";
cout << xishu[i];
}
for(int i = 0 ; i < posD - len ; i ++){ // 输出保持精度的后导零
cout << "0";
}
}else{
cout << "0."; // 0 : 0.xishu , -1 : 0.0xishu , -2 : 0.00xishu ... ...
for(int i = 0 ; i < abs(posD) ; i ++) cout << "0";
for(unsigned int i = 0 ; i < xishu.size() ; i ++){
cout << xishu[i];
}
}
cout << endl;
return 0;
}