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 }
作者:PennyXia
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。