题目详情:
1024 科学计数法 (20 分)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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
解答:
#include <iostream>
using namespace std;
int main()
{
string str, temp; cin >> str;
int index, spot = 2, e;
for (int i = 0; i < str.size(); i++) {
if (str[i] == 'E') {
e = i; //获取E的索引
while (str.size() - i) temp += str[++i]; //获取指数
break;
}
}
index = atoi(temp.c_str());
if(str[0] == '-') cout << str[0]; //判断正负
if (index < 0) { //指数小于0的情况
index = (-index) - 1;
cout << "0.";
while (index--) cout << '0';
cout << str[1];
while (e - spot - 1) cout << str[++spot]; //输出.到E之间的数
} else { //指数大于0的情况
if (index - (e - spot - 1) < 0) { //指数大于0但小于小数点后的位数
cout << str[1];
while (index--) cout << str[++spot];
cout << '.';
for(int i = 0;i < (e - spot - 1);i++) cout << str[spot + i + 1];
} else { //指数大于小数点后位数
index = index - (e - spot - 1);
cout << str[1];
while (e - spot - 1) cout << str[++spot];
while (index--) cout << '0';
}
}
return 0;
}
升级版:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str, temp; char c;
int index, spot = 2;
while (cin >> c) {
if (c == 'E') break; //通过判断E分别读入小数和指数
str.push_back(c);
}
cin >> index;
if (str[0] == '-') cout << str[0]; //判断正负
if (index < 0) {
cout << "0.";
for (int i = 1; i < -index; i++) cout << '0';
cout << str[1];
for (int i = spot + 1; i < str.size(); i++) cout << str[i];
} else {
cout << str[1];
for (int i = spot + 1; i < str.size(); i++) {
cout << str[i];
if (i - 2 == index && i != str.size() - 1) cout << '.'; //当前位数等于指数并且不是最后一位则输出小数点
}
for (int i = str.size() - 3; i < index; i++) cout << '0';
}
return 0;
}
关键点:
1.小数点到E之间的输出
2.多种情况的区分
3.0的输出