当前位置: 代码迷 >> 综合 >> PAT乙级——1024(模拟数字转换)
  详细解决方案

PAT乙级——1024(模拟数字转换)

热度:2   发布时间:2023-12-13 06:32:35.0

题目:科学计数法 (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

题目分析及代码实现

分情况讨论:

  1. 首先是有效数字的符号正负,影响第一位的输出;
  2. 当阶数为负时,先输出零,在输出有效位
  3. 当阶数为正时,要来考虑两种情况,一是阶数小于小数位有效数字长度,这种需要考虑打印完整数部分还要打印小数部分,二是阶数大于小数位有效数字长度,这种再打印完整数部分后还需要打印0来补齐。
//有一个超时,19分
import java.util.Scanner;public class Main {
    public static void main(String []args) {
    Scanner in =new Scanner(System.in);String input =in.nextLine();in.close();String temp[]=input.split("E");if(temp[0].charAt(0)=='-')System.out.print("-");String aString=temp[0].substring(1);//从第二个位置开始char a []=aString.toCharArray();//转成char型数组,不包含符号位int num=Integer.valueOf(temp[1]);if(num<0) {
    //阶数为负时较为简单System.out.print("0.");//打印0for (int i = 0; i < (-num)-1; i++) System.out.print("0");	//打印有效数字for (int i = 0; i < a.length; i++) {
    if(a[i]!='.')System.out.print(a[i]);}	}else {
    System.out.print(a[0]);int count=0;//统计次数 for (int i = 2; i < a.length&&count<num; i++) {
    //打印有效小数点前的非零数字//当超过小数点后有效数字长度或超过阶数时跳出//从第二位开始打印,省略小数点System.out.print(a[i]);count++;//统计打印次数}int count1=count;//若是阶数小于 科学计数法小数位 长度,需输出小数点和小数位if(num<a.length-2) {
    			for (int i = count+2; i < a.length; i++) {
    //当打印长度达到阶数却小于有效数字长度时,打印小数点if(count1==num)System.out.print(".");System.out.print(a[i]);	count1++;}					}//若是阶数大于有效数字长度时,打印完有效数字还需打印打印0if(a.length-2<num) {
    for(int i=0;i<num-a.length+2;i++)System.out.print("0");}			}}
}

在这里插入图片描述

  相关解决方案