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函数,但是由于不是标准库函数,就不一一写出来了。