游戏ui设计需要学什么软件,网站优化策划书,互联网营销师报考条件,免费天眼查题目 1024 科学计数法
作者 HOU, Qiming
单位 浙江大学
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法#xff0c;其满足正则表达式 [-][1-9].[0-9]E[-][0-9]#xff0c;即数字的整数部分只有 1 位#xff0c;小数部分至少有 1 位#xff0c;该数字及其指…题目 1024 科学计数法
作者 HOU, Qiming
单位 浙江大学
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法其满足正则表达式 [-][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.2E10输出样例 2
-12000000000 思路
这道题的主要思路首先把读取的字符串拆分成子串以便取出底数和指数部分然后根据指数的正负来判断可能需要在数字的右边还是左边补零最后输出结果即可。
这其中有几个问题的处理方式我记录在此。
1.对输入字符串的拆分
以往PAT的题目输入内容都是以空格为间隔的那么只要用String.split()配合简单的正则表达式即可将输入内容以空格为分隔符切分为多个子串返回字符串数组。如下。
//获取输入流对象
BufferedReader br new BufferedReader(new InputStreamReader(System.in));//将输入的一行内容 以一个或多个空格为分隔符 切分为字符串数组
String[] arr br.readLine().split( );
/*readLine()读取一行输入返回Stringsplit()函数的参数是切分字符串的分隔符返回String[] 是正则表达式表示一个或多个空格
*/
在这道题目中也可以用“E”以及小数点“\\.”作为间隔符来切分子串。但这样得到的子串中仍然会包含正负号还要再进一步处理。小数点写\\是为了转义因为“.”在正则表达式中有特殊含义表示匹配除了换行符外的任意字符。
这道题目的输入符合一个指定的正则表达式那么其实就可以利用正则表达式来方便地切分字符串。切分的时候注意Java并不知道我们希望怎样切分所以写正则表达式的时候要用括号来表示分组那么Java就会按照这个分组来切分子串。
根据正则表达式来切分字符串的具体方法见代码。 //待切分的字符串String str 1.230E-4;//输入的字符串所符合的正则表达式String pattern ([-])([1-9])(\\.)([0-9])(E)([-])([0-9]); /*注意要用括号来表示分组每个分组会被切分为一个子串*///Pattern类用于编译正则表达式Pattern r Pattern.compile(pattern); //Matcher类用于根据正则表达式将字符串进行匹配Matcher m r.matcher(str); //优先处理特殊情况 if(!(m.find())) { //若字符串与正则表达式匹配失败System.out.println(字符串输入有误请根据正则表达式输入); //输出错误提示信息return; //程序返回}//若字符串与正则表达式匹配成功int count m.groupCount(); //获取匹配到的子串数量String[] s new String[count]; //新建字符串数组for (int i 0; i count; i) //遍历字符串数组s[i] m.group(i1); //用group()方法获取每个子串存到字符串数组中/*注意group()方法的参数是从1开始的*///打印数组等后续代码
2.拼接字符串
这道题涉及对字符串的拼接处理这其实比较耗时如果频繁使用新建字符串以及频繁使用substring()方法取子串的话在PTA平台上容易超时。这里可以采用更高效的字符串拼接方法StringBuilder类。需要拼接的时候只要append()一下就可以打印也很方便。使用方法如下。
StringBuilder strb new StringBuilder();
/*
构造字符串StringBuilder是一个可变对象
可以降低字符串拼接的时间复杂度不然在PTA平台上可能超时
*/strb.append(I Love ); //追加一些内容strb.append(Java); //在结尾再追加一些内容System.out.println(strb); //直接放在println()函数中打印即可//打印结果 I Love Java3.switch语句
这道题中正常情况下指数前面的符号只会有正负两个值正好就可以用switch语句只需要两个case分支顺道还可以有default来应对异常状况。当然也可以用if语句只不过switch语句更快那么一点点于是就用switch语句吧。 Java代码
最终所有测试点都测试通过。代码如下。
/*
功能给定以科学计数法表示的一个数字输出其普通表示形式*/
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {public static void main(String[] args) throws IOException{//接收输入BufferedReader br new BufferedReader(new InputStreamReader(System.in));String str br.readLine(); //读取科学计数法表示的数字//根据正则表达式进行匹配将输入信息切分为子串String pattern ([-])([1-9])(\\.)([0-9])(E)([-])([0-9]); //输入字符串符合的正则表达式注意要用括号来表示分组每个分组会被切分为一个子串Pattern r Pattern.compile(pattern); //Pattern类用于编译正则表达式Matcher m r.matcher(str); //Matcher类用于根据正则表达式将字符串进行匹配if(!(m.find())) { //若字符串与正则表达式匹配失败System.out.println(字符串输入有误请根据正则表达式输入); //输出错误提示信息return; //程序返回}//若字符串与正则表达式匹配成功int count m.groupCount(); //获取匹配到的子串数量String[] s new String[count]; //新建字符串数组for (int i 0; i count; i) //遍历字符串数组s[i] m.group(i1); //用group()方法获取每个子串存到字符串数组中//分析并生成数字的普通形式StringBuilder result new StringBuilder(); // 构造字符串StringBuilder是一个可变对象可以降低字符串拼接的时间复杂度if(-.equals(s[0])) //生成开头的正负号result.append(-);int zhi Integer.parseInt(s[6]); //指数的数值if(zhi0){ //若指数为0则直接输出整数和小数部分即可result.append( s[1] s[2] s[3]);System.out.println(result);return; }//若指数不为0switch(s[5]){ //判断指数的正负号case : //如果指数为正数int di s[3].length(); //底数部分的小数位数if(zhi di){ //若指数比底数的小数位数多则最终结果不会有小数点result.append( s[1] s[3] ); //生成整数位、有效位for(int i0;izhi-di;i)result.append( 0); //再把剩余的尾数0都加上}else{ //若指数不如底数的小数位数多则最终结果仍要有小数点result.append( s[1] s[3].substring(0,zhi)); //生成整数位、整数部分的有效位result.append( s[2] s[3].substring(zhi)); //生成小数点、小数部分的有效位} break;case -: //如果指数为负数result.append(0.); //生成整数位、小数点for(int i0;izhi-1;i) //生成小数点后最高位的0result.append( 0);result.append( s[1] s[3]); //生成有效位break;default:System.out.println(输入有误);break;}//打印输出System.out.println(result);}
}