whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1024 || 科学计数法(详解,C/C++示例,测试点分析)

Posted on 2019-08-23 In PAT

科学计数法

题目描述

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-] [1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式

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

输出格式

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

输入样例1

1
+1.23400E-03

输出样例1

1
0.00123400

输入样例2

1
-1.2E+10

输出样例2

1
-12000000000

问题解决

解题思想

本题主要是根据输入来控制相应的输出,一些细节较多,容易犯低级错误。设置字符数组以接收输入的科学计数法格式的数字,输入的同时需要计算出指数的数值大小以备后面直接使用;之后,首先检查数字的符号,+不输出,-需要输出;接着,按指数的符号分以下两种情况处理:

指数符号为-

若指数数值为0,则直接输出数字的有效数值部分即可(即E之前的数值部分);否则,小数点需要向左进行相应的移动(小数点在第一位0之后),并补上相应个数的0(在小数点与原有效数值的第一位之间)。

指数符号为+

若指数数值为0,则直接输出数字的有效数值部分即可(即E之前的数值部分);否则,小数点需要向右进行相应的移动,若小数点未移动出有效数值部分,则在相应位置需要输出小数点,若小数点移动出了有效数值部分,则不需要输出小数点,并在右侧补上相应个数的0。

代码示例(C/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
52
53
54
55
56
57
58
59
60
61
62
#include <cstdio>
#define MAX 9999
using namespace std;
int main()
{
char sci_a[MAX];
int ind = 0,flag = 0,loc;//存指数数值(指数的绝对值不超过9999)
//flag用以标记上一个输入字符是否为指数的符号
//loc记录指数的符号
for(int i = 0;(sci_a[i] = getchar()) != '\n'; i++){
if((sci_a[i - 1] == '+'||sci_a[i - 1] == '-')&&(i - 1) != 0){
flag = 1;//上一个输入字符为指数的符号则标记变为1
loc = sci_a[i - 1];//记录指数的符号
}
if(flag){//计算指数的数值
ind =ind * 10 + sci_a[i] - '0';
}
}
if(sci_a[0] == '-'){
printf("%c",sci_a[0]);
}//数字的符号为-时需要输出,为+时不需输出
int i = 1;
if(loc == '-'){
int mar1 = 1;//标记指数是否为0,若是则直接输出E之前有效数字部分即可否则小数点需要向前移动
if(ind != 0){
mar1 = 0;
printf("0.");
for(int j = 1; j < ind; j++){
printf("0");
}
}
while(sci_a[i] != 'E'){
if(sci_a[i] != '.'||mar1){
printf("%c",sci_a[i]);//注意:此处不要误写成%d
}
i++;
}
}
else{//指数的符号为+
int mar2 = 1;//标记小数点是否输出
printf("%c",sci_a[i]);
i += 2;//移过数字的第一位和小数点
while(sci_a[i] != 'E'){
if(ind){
printf("%c",sci_a[i]);
ind--;
}
else{
if(mar2){
printf(".");
mar2 = 0;
}
printf("%c",sci_a[i]);
}
i++;//注意不要忽略
}
while(ind--){//有效数字全部输出后,右侧补0
printf("0");
}
}
return 0;
}

题目来源:PAT乙级1024
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1023 || 组个最小数(详解,C/C++示例,测试点分析)
PAT乙级1025 || 反转链表(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 科学计数法
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
        1. 1.8.1.0.1. 指数符号为-
        2. 1.8.1.0.2. 指数符号为+
    9. 1.8.2. 代码示例(C/C++)
© 2021 Mengzhao Wang