PAT 1024. 科学计数法 (20)

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

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

要求


时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
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.2E+10
输出样例2:
-12000000000

分析

乍一看还没有什么头绪,不知道怎么去做,感觉先要得到两个符号(数的正负,指数的正负),得到指数的值,前面的数,然后在各种各种,想想就很麻烦,试着用vector各种存,越写越觉得复杂。过了两天再看,发现文中一句话很关键其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9],第一位一定是数的符号,第二位一定非0,第三位一定是小数点,字符串中一定有一个“E”,E后面一定是指数部分的符号,直接用字符串操作就可以了。

对字符串操作还不是那么熟练,什么字符串的各个函数,字符串截取,字符串转数字(感觉这个用的很多)。

代码

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<iostream>
#include<string>
#include <sstream>

using namespace std;

int main(){
int n,lens,lenzs;
string s,zs;
stringstream ss;

cin>>s;

string::size_type pos = s.find('E');
zs=s.substr(pos+2); // 指数

lens=s.length();
lenzs=zs.length();
lens=lens-lenzs-5; // 小数点后面的数字有几位

ss<<zs;
ss>>n; // 求出指数 (转整数)

if(s[pos+1]=='-'){ // 指数为负

if(s[0]=='-') // 数是负数时
cout<<"-";

for(int temp=0;temp<n;temp++){ // 输出
if(temp==0)
cout<<"0."; // 第一位包含小数点
else
cout<<"0"; // 补0
}
cout<<s[1];
for(int temp=3;temp<pos;temp++){ // s[2]一定是小数点
cout<<s[temp];
}
}
if(s[pos+1]=='+'){ // 指数为正
if(s[0]=='-') // 数是负
cout<<"-";

cout<<s[1]; // 非符号位的第一个数字(肯定不是0!!)

int temp;

for(temp=0;temp<n;temp++){ // 输出
if(temp<lens)
cout<<s[temp+3];
else cout<<"0";
}

if(n<lens){ // 如果指数较小,小于lens,即后面还有小数部分
cout<<"."; // 输出小数点
for(int temp1=0;temp1<lens-n;temp1++){
cout<<s[temp+temp1+3]; // 逐位输出原来的数据
}
}
}
return 0;
}
坚持原创技术分享,您的支持将鼓励我继续创作!