题目描述:

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

		}

	}
}