题目描述:
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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
思路分析:(思路分析参考了算法笔记)
1.先定E 的位置,用e 存储。再求得指数的绝对值 exp
2.先输出正负
3.指数为0时,直接输出原数
4.指数为负数时,最后转化后只有一种情况:小数点前面肯定只有一个0。小数点后面的 0 的个数为 exp-1,再加上原来的数中 E 之前的数(跳过小数点)。
5.指数 为正数时,小数点放在 exp+2 的位置(因为原来输入的那行字符串中,小数点的位置就是 2 )。分三种情况:
(1)最终的小数点在E 的位置之前,则在 exp+2 的位置上输出小数点
(2)若 exp+2 恰好在整个数的最右边,即 exp+2==e-3 (e是输入的字符串中E的位置,3是符号位+小数前的一位+小数点所在的一位之和,所以 e-3 就是E和小数点之间的数字个数)。此时无需输出小数点
(3)若 exp 较大,还需额外再输出0
代码如下:
package pat;
import java.util.Scanner;
//科学记数法
public class B1024 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int length = s.length();
//先输出符号
System.out.print(s.charAt(0));
// 找到字符串中E所在的位置
int e = 0;
while (s.charAt(e) != 'E') {
e++;
}
// 先获取到指数的绝对值
int exp = 0;
for (int i = e + 2; i < length; i++) {
exp = exp * 10 + (s.charAt(i) - '0');
}
if (exp == 0) {
// 指数为0时直接输出
for (int j = 0; j < s.length(); j++) {
System.out.print(s.charAt(j));
}
}
// 如果指数为负数
if (s.charAt(e + 1) == '-') {
System.out.print("0.");
for (int a = 0; a < e - 1; a++) {
System.out.print("0");
}
System.out.print(s.charAt(1));// 原数中小数点之前的shu
// 再输出小数点之后的数
for (int b = 3; b < e; b++) {
System.out.print(s.charAt(b));
}
} else {
// 指数为正
for (int m = 1; m < e; m++) {
if (s.charAt(m) == '.')
continue;
System.out.print(s.charAt(m));
if (m == exp + 2 && exp != e - 3) {
System.out.print(".");
}
}
// 如果还需要补0时,再输出多出的0
for (int m = 0; m < (exp - (e - 3)); m++) {
System.out.print("0");
}
}
}
}