科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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
分析:
给定字符串 str ,
1. 如果 str[0] == ‘-‘ ,就输出负号
2. 找到 E 的位置 indexOfE ,将字符串分割成两个部分 beforeE // 不包括符号位 和 num // 指数
3. 如果指数小于0,先输出 0. ,再输出 num - 1 个0,接着输出 beforeE 中的数字(里面的小数点不输出)
4. 如果指数大于等于0,先输出 beforeE[0] ,即小数点前的一个数字。
4.1 如果 beforeE 中小数点后的数字长度大于 num ,就将 beforeE 小数点后的 num 个数字输出,接着输出小数点,最后输出剩余的数字
4.2 如果 beforeE 中小数点后的数字长度等于 num ,就直接输出 beforeE 小数点后的数字
4.3 如果 beforeE 中小数点后的数字长度小于 num ,就将 beforeE 小数点后的数字输出,最后输出 num - beforeE.size() + 1 个0 (+1是因为字符串把小数点的长度也算进去了)
C++实现:
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string str; cin >> str; if (str[0] == ‘-‘) { cout << ‘-‘; } int indexOfE = 0; while (str[indexOfE] != ‘E‘) { indexOfE++; } string beforeE = str.substr(1, indexOfE - 1); //从下标1开始,截取indexOfE - 1 个字符 int num = stoi(str.substr(indexOfE + 1)); // 从iindexOfE + 1 到末位的字符串,转int if (num < 0) { cout << "0."; for (int i = 0; i < abs(num) - 1; ++i) { cout << 0; } for (int i = 0; i < beforeE.size(); ++i) { if (beforeE[i] != ‘.‘) { cout << beforeE[i]; } } } if (num >= 0) { cout << beforeE[0]; int len = beforeE.size() - 2; // 小数点后的数字长度 if (len > num) { int cnt = 0; int i = 0; for (i = 2, cnt = 0; i < beforeE.size() && cnt < num; ++i, ++cnt) { cout << beforeE[i]; } cout << ‘.‘; for (int j = i; j < beforeE[j]; ++j) { cout << beforeE[j]; } } else if (len == num) { for (int i = 2; i < beforeE.size(); ++i) { cout << beforeE[i]; } } else if (len < num) { for (int i = 2; i < beforeE.size(); ++i) { cout << beforeE[i]; } for (int i = 0; i < num - len; ++i) { cout << 0; } } } system("pause"); return 0; }
Java实现:
原文地址:https://www.cnblogs.com/47Pineapple/p/12217774.html