2019-02-27-PAT乙级-1024-科学计数法

2019-02-27-PAT乙级-1024-科学计数法

2019-02-27-PAT乙级-1024-科学计数法

原文链接:PAT乙级-1024-科学计数法

github代码地址:HibisciDai/OJ-PAT-ACM

2019-02-27-PAT乙级-1024-科学计数法

编程描述

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [ +- ] [1-9].[ 0-9 ]+E[ +- ][ 0-9 ]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

辅助描述

1
2
3
4
5
作者: HOU, Qiming
单位: 浙江大学
时间限制: 200 ms
内存限制: 64 MB
代码长度限制: 16 KB

输入格式

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例1

1
+1.23400E-03

输出样例1

1
0.00123400

输入样例2

1
-1.2E+10

输出样例2

1
-12000000000

分析过程

关键在指数

  • 1指数>0
  • 1.1指数<小数长度
    输出第一个字符+ -号
    输出第二个字符
    输出第 4个字符 到 3+指数大小 个字符
    输出小数点
    输出 3+指数大小+1 到 E的字符
  • 1.2指数>小数长度
    输出第一个字符+ -号
    输出第二个字符
    输出小数点到E之间数字
    输出 指数大小-(小数点到E直接数字个数) 个0
  • 2指数<0
    输出第一个字符+ -号
    输出0.
    输出对应 指数个数-1 个0
    输出第二个字符
    输出第三个字符到E的位置

算法实现

JAVA(openjdk)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
int e = -1;

for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == 'E') {
e = i;
}
}
int ex = Integer.parseInt(input.substring(e + 2, input.length()));

if (input.charAt(e + 1) == '-') {//指数为负数
if (input.charAt(0) == '-') {
System.out.print("-");
}
System.out.print("0.");

for (int i = 0; i < ex - 1; i++) {
System.out.print("0");
}
System.out.print(input.charAt(1));
for (int i = 3; i < e; i++) {
System.out.print(input.charAt(i));
}
} else {//指数为正数
if (ex < (e - 3)) {//指数<小数长度
if (input.charAt(0) == '-') {
System.out.print("-");
}
System.out.print(input.charAt(1));
for (int i = 3; i < (3 + ex); i++) {
System.out.print(input.charAt(i));
}
System.out.print(".");
for (int i = 4 + ex; i < e; i++) {
System.out.print(input.charAt(i));
}
} else {//指数>小数长度
if (input.charAt(0) == '-') {
System.out.print("-");
}
System.out.print(input.charAt(1));
for (int i = 3; i < e; i++) {
System.out.print(input.charAt(i));
}
for (int i = 0; i < ex - (e - 3); i++) {
System.out.print(0);
}
}
}

}
}

运行结果

1
2
3
4
5
6
7
8
9
10
状态	分数	题目	编译器	耗时	用户
部分正确 16 1024 Java (openjdk) 170 ms HibisciDai
测试点 结果 耗时 内存
0 答案正确 163 ms 11388 KB
1 答案正确 153 ms 11392 KB
2 答案正确 148 ms 11424 KB
3 答案正确 129 ms 11304 KB
4 答案错误 170 ms 11520 KB
5 运行超时 0 ms 0 KB
6 运行超时 0 ms 0 KB

C

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int len0=0;
cin>>s;
for(int i=0;i<s.length();i++)
if(s[i]=='E')//找到E
{
for(int j=i+2;j<s.length();j++)
len0=len0*10+(s[j]-'0');//计算指数即需要增加的0的长度
if(s[0]=='-')
cout<<'-';
if(len0==0)//若指数为0
{
for(int j=1;j<i;j++)//输出下标从1开始到E的串
cout<<s[j];
}
else if(s[i+1]=='+')//若指数为正
{
cout<<s[1];//输出整数部分
if(len0<i-3)//若0的长度小于小数部分长度
{
for(int j=3;j<3+len0;j++)//输出下标从3开始的0的长度的部分
cout<<s[j];
cout<<'.';//输出小数点
for(int j=3+len0;j<i;j++)//输出小数点后到E之间的部分
cout<<s[j];
}
else//若0的长度大于等于小数部分长度
{
for(int j=3;j<i;j++)//输出下标从3开始到E的部分
cout<<s[j];
for(int j=1;j<=len0-(i-3);j++)//输出0长度-小数部分长度的0
cout<<0;
}
}
else//若指数为负
{
cout<<"0.";//输出0和小数点
for(int j=1;j<len0;j++)//输出0长度-1的0
cout<<0;
cout<<s[1];//输出原整数部分
for(int j=3;j<i;j++)//输出原小数部分
cout<<s[j];
}
return 0;
}
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
状态	分数	题目	编译器	耗时	用户
答案正确
20 1024 C++ (g++) 5 ms HibisciDai
测试点 结果 耗时 内存
0 答案正确 3 ms 416 KB
1 答案正确 3 ms 416 KB
2 答案正确 4 ms 384 KB
3 答案正确 3 ms 384 KB
4 答案正确 3 ms 384 KB
5 答案正确 5 ms 384 KB
6 答案正确 5 ms 504 KB
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2019/02/28/2019-02-27-PAT乙级-1024-科学计数法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
支付宝打赏
微信打赏