题目:科学计数法 (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
题目分析及代码实现
分情况讨论:
- 首先是有效数字的符号正负,影响第一位的输出;
- 当阶数为负时,先输出零,在输出有效位
- 当阶数为正时,要来考虑两种情况,
一是
阶数小于小数位有效数字长度,这种需要考虑打印完整数部分还要打印小数部分,二是
阶数大于小数位有效数字长度,这种再打印完整数部分后还需要打印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");} }}
}