B1024/A1073科学计数法

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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

思路:

• 首先遍历字符串找到E所在的位置,使用头文件<string>中的substr()函数存储E之前的字符串a和E之后的指数字符串b;

【注】Substr(pos,len)返回从pos位开始,长度为len的子串;

• 将b通过stoi()函数转换成整数型e判断正负。若为负,先输出0.,然后输出e-1个0,最后输出字符串a;若为正,比较a小数点之后的位数cnt和e的大小,若e大,输出a(除小数点)之后,再输出e-cnt个0,否则,输出小数点后的e位数然后输出小数点,最后输出a剩余部分。

问题:

测试2 3答案错误

解决:

加一个e!=cnt时才输出小数点的if语句。

 

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 int main() {
 5     string str;
 6     cin >> str;
 7     if (str[0] == '-')cout << "-";
 8     int i = 0;
 9     while (str[i] != 'E')i++;
10     string a = str.substr(1, i - 1);
11     string b = str.substr(i + 1, str.length() - i);
12     int e = stoi(b);
13     if (e < 0) {
14         cout << "0.";
15         for (int j = 0; j < abs(e) - 1; j++)cout << "0";
16         for (int k = 0; k < a.length(); k++) {
17             if (a[k] == '.');
18             //k++;
19             else cout << a[k];
20         }
21     }
22     else if (e > 0) {
23         int cnt = a.length() - 2;
24         if (cnt < e) {
25             for (int k = 0; k < a.length(); k++) {
26                 if (a[k] == '.');
27                 else cout << a[k];
28             }
29             for (int j = 0; j < e - cnt; j++)cout << "0";
30         }
31         else {
32             cout << a[0];
33             for (int j = 2; j < e + 2; j++) {
34                 cout << a[j];
35             }
36             if (e != cnt)cout << ".";//防止一个数最后一个小数点
37             for (int k = e + 2; k < a.length(); k++)
38                 cout << a[k];
39         }
40     }
41     else cout << a;
42     return 0;
43 }

 

 

posted @ 2020-02-11 18:14  PennyXia  阅读(146)  评论(0编辑  收藏  举报