PAT乙级1024,超详细题目解析带你一步一步分析,附AC代码注释

1024 科学计数法 (20分)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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拆分成2个字符串,左边字符串化成字符数组c,右边字符串转化为int型数据存放到D中。

if(D<0):

①先判断c[0]是’+‘还是’-’,是’+‘不输出,是’-‘输出’-’

②然后输出0.

③紧接着输出D-1个0

④最后把字符数组中除了符号位和小数点全部照常输出就OK了

D<0这种情况不是很复杂,注意输出顺序。

if(D>0):(这种情况有坑)

①判断c[0]是’+‘还是’-’,是’+‘不输出,是’-‘输出’-’

②输出c[1]

③下面举例子方便理解

(1) -1.2000E+05 输出-120000

(2) -1.2000E+02 输出-120.00(注意小数点,坑就在这)

(3) -1.2000E+04 输出-12000

要不要加小数点的临界条件是c[i]的iD+2,2代表小数点前的2位数字,如果i>D+2,表明小数点已经向后移动了D为,但是c还有数据,所以要填个小数点,然后把c中的数据全部输出。但是看(3)当i=c.length-1时,刚好iD+2,此时刚好小数点到达最后一位,不应输出。所以满足输出小数点的条件是:i==D+2&&i!=c.length-1

if(D==0):

①先判断c[0]是’+‘还是’-’,是’+‘不输出,是’-‘输出’-’

②c数组中除了符号位其它照常输出

AC代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String[] str=br.readLine().split("E");//按照E拆分成两部分
        char[] c=str[0].toCharArray();//左边化成字符数组
        int D=Integer.parseInt(str[1]);//右边化成int型数据
        //如果D是0,除了符号位其它原样输出
        if(D==0){
            if(c[0]=='-'){
                System.out.print(c[0]);
            }
            for(int i=1;i<c.length;i++){
                System.out.print(c[i]);
            }
            return;
        }
        //D>0,小数点右移
        if(D>0){
            if(c[0]=='-'){//先判断符号位是+还是-
                System.out.print(c[0]);
            }
            //输出c[1]
            System.out.print(c[1]);
            //count表明最后边填0的个数,可以是负数
            int count=D-(c.length-3);//为什么是减3,符号位 整数部分 小数点一共三位
            //i=3是小数点后的第一位
            for(int i=3;i<c.length;i++){
                //其它部分照常输出
                System.out.print(c[i]);
                //如果满足这个条件输出一个小数点
                if(i==D+2&&i!=c.length-1){
                    System.out.print(".");
                }
            }
            //如果count是负数,那么这个循环就不执行了
            for(int i=0;i<count;i++){
                System.out.print("0");
            }
        }else if(D<0){//D<0按照我给的步骤一步一步来就行了
            D=-D;
            if(c[0]=='-'){
                System.out.print(c[0]);
            }
            System.out.print("0.");
            int count=D-1;
            for(int i=0;i<count;i++){
                System.out.print("0");
            }
            for(int i=1;i<c.length;i++){
                if(i!=2){
                    System.out.print(c[i]);
                }
            }
        }
    }
}

这里说一下最后一个测试点容易超时,可以换用BufferedReader,如果还是超时的话可以多点几次提交,按照陈越姥姥的话来说,PAT有好几台机器在判题,其中一台特别快,有大概1/6的概率可以通过其他机器超时的测试点,所以如果点了好几次提交最后一个测试点还是超时的话就不要纠结了,我也是偶尔一次通过了,再次提交就显示最后一个测试点超时了。

更多题目解析可关注公众号算法宝贝

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值