一、题目


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

二、解析


分情况讨论,分离这个正则表达式,可以把输入样例分成三个部分。记为left,middle,right,分值≤0或>0两种情况讨论:

  • <=0,即值为小数,这时候只要搞清楚小数点向左移的位数就行了。,拿样例1做例子,分别是:+1,23400,-03。明显这个例子leftMove=3,先输出0和小数点,再输出剩余的0,再输出left部分的整数1,再输出middle部分就行;leftMove如果为0需要特殊讨论,先输出left部分的整数1,再小数点,再middle部分。
  • >0,即值为正数,先搞清楚小数点会往右移动的位数,这里也分两种情况,需不需要补零。不管需不需要补零,都要先输出left的整数部分。如果需要补零,先输出middle部分,再补零即可;若不需要,则计算出小数点的位置,输出middle部分小数点前的,再输出小数点,再输出小数点后的。

最后讨论一下正负号应不应该输出即可。

三、代码


import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String str[] = input.next().split("\\.|E");
//        for (String s : str) {
//            System.out.println(s);
//        }
        StringBuffer sb = new StringBuffer();
        // <=0 的情况
        if(str[2].charAt(0) == '-'){
            int leftMove = Integer.parseInt(str[2].substring(1, str[2].length()));
            if(leftMove == 0){
                sb.append(str[0].charAt(1));
                sb.append(".");
            }else{
                for(int i=0; i<leftMove; i++){
                    if(i==0) sb.append("0.");
                    else sb.append("0");
                }
                sb.append(str[0].charAt(1));
            }
            sb.append(str[1]);
        }
        // >0的情况
        else{
            int rightMove = Integer.parseInt(str[2].substring(1, str[2].length()));
            int countZero = rightMove - str[1].length();
            sb.append(str[0].charAt(1));
            if(countZero < 0 ){
                for (int i = 1; i <= str[1].length(); i++) {
                    if(i == rightMove) sb.append(str[1].charAt(i-1)+".");
                    else sb.append(str[1].charAt(i-1));
                }
            }else{
                sb.append(str[1]);
                for (int i = 0; i < countZero; i++)
                    sb.append("0");
            }
        }
        if(str[0].charAt(0) == '-') System.out.print("-");
        System.out.print(sb);
    }
}