心得:
对待问题时找规律,以分解的思想看问题
题目:
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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
思路:
把各个部分从这个字符串中提取子串出来,
如数字部分,就是第一个符号和E之间的数(当然,不算小数点),
指数部分是从E后面第二个字符一直到结束,至于前面的零,字符流就可以去掉,
数字部分的符号是字符串的第一位,
指数部分的符号是E后面第一个字符
将这些部分取出后,再利用条件判断就可以做出
至于测试点2,3,4,当指数符号是+时,
1.得到的结果可能是含有小数点的,如+1.234E+2,结果是123.4;
2.也可能是不含的,如+1.86E+2,结果是186;
3.还有可能就是后面补零的,如+1.2E+3,,结果就是1200了
所以输出什么,可以根据指数大小和数字部分的长度比较,就能得出想要的结果了
代码:
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
int expo,e_index,flag;//expo指数,e_indexE的下标,flag指数大小和数字部分的长度比较后结果
string num,coe_sign,expo_sign,coe,temp,res;//coe_sign数字部分符号,expo_sign指数符号,coe数字部分,res结果
stringstream ss;//下面就是取得各个部分的值
cin>>num;
coe_sign=num[0];
e_index=num.find('E');
expo_sign=num.substr(e_index+1,1);
for(int i=1;i<e_index;i++)
{
if(isdigit(num[i]))
coe.push_back(num[i]);
}
temp=num.substr(e_index+2);
ss<<temp;
ss>>expo;//到这取值完毕,下面开始判断输出
if(expo_sign=="-")
{//当指数符号为-时,就要在数字部分前补零 补小数点
while(expo--)
coe.insert(0,"0");
coe.insert(1,".");
if(coe_sign!="+")//数字部分符号为+就不输出,不然就输出
res+=(coe_sign+coe);
else
res=coe;
}
else
{//指数符号为+,考虑各种情况
flag=expo-(coe.size()-1);//根据指数大小和数字长度比较结果作为判断依据
if(flag<0)
coe.insert(expo+1,".");//当flag<0,就在指定位置加小数点(在纸上验算就可以明白)
else if(flag>0)
{//当flag>0时,就补零
while(flag--)
coe.append("0");
}//没加else就是flag=0时,就什么也不做
if(coe_sign!="+")
res+=(coe_sign+coe);
else//判断数字符号是否输出
res=coe;
}
cout<<res;
return 0;
}