PAT Basic 1024

1024 科学计数法 

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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

题解:这道题看上去感觉有点麻烦,要求保持精度基本上是要用字符串输出没错了,基本思路是 1.数字是负数,输出-,正数则不用理会。 2.判断指数部分为正还是为负

   ①若指数部分为负,输出"0."后根据指数部分的大小补0再输出原字符串的整数和小数部分即可。
   ②若指数部分为正,并且指数部分小于原字符串的精度,不需要补0,则先输出原字符串的整数部分以及小数点前的部分,再输出小数点及其之后的部分。
   ③若指数部分为正,并且指数部分大于原字符串的精度,需要补0,则先输出原字符串的整数及小数部分,再在其后补0即可。
个人所用的一些知识点复习:
  1.stringstream既可以便于一些题目中的输入操作,也可以用于字符串转int型。
  2.string下的substr方法,第一个参数表示开始截取字符串的位置,第二个参数表述截取的长度,如果截取长度超过该字符串的长度,则自动将字符串从截取位置开始全部截取。
  注意:如果截取开始位置超过字符串长度,程序会抛出异常:
   terminate called after throwing an instance of 'std::out_of_range'what():
 basic_string::substr
代码如下:
 1 #include<iostream>
 2 #include<string>
 3 #include<sstream>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     string a, flo, k;
10     stringstream k2;
11     char tail;
12     int m = 0, k1;
13     cin>>a;
14     /* 将小数部分存入 flo中  */ 
15     for( int i = 3 ; i < a.length(); i++, m++){
16         if( a[i] == 'E')
17             break;
18     }
19     flo = a.substr(3,m);
20     /* 将指数部分的符号存入tail中 */ 
21     tail = a[3+m+1];
22     /* 将指数部分的绝对值存入k1中 */ 
23     k = a.substr(3+m+2,a.length());
24     k2 << k;
25     k2 >> k1;
26     
27     if( a[0] == '-' )
28         printf("-");
29     if( tail == '-' ){
30         printf("0.");
31         for( int i = 0; i < k1 - 1; i++)
32             printf("0");
33         cout<<a[1]<<flo<<endl;
34     }
35     else{
36         if(k1 < flo.length()){
37             string b = flo.substr(0,k1);
38             string c = flo.substr(k1,flo.length());
39             cout<<a[1]<<b<<"."<<c<<endl;
40         }
41         else{
42             cout<<a[1]<<flo;
43             for( int i = 0; i < k1-flo.length(); i++)
44                 printf("0");
45         }
46     }
47     return 0;
48 }

 

这道题还有其他很多优秀的做法,比如字符串转数字可以使用stoi函数,但是由于不是标准库函数,就不一一写出来了。
    

转载于:https://www.cnblogs.com/yxp400/p/9454388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值