科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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.23400 * 10^-3 等于0.00123400
把0.看出一段 这是无论如何都存在的 所以可以先输出0.
中间的00看成一段 这一段的0个数与指数有关 指数为-1 输出0个0 指数为-2 输出1个0 以此类推 循环输出
最后的主体部分123400 就是原式中的1.23400去掉小数点 处理一下输出
三次输出,构成答案,如果全部挤在一起输出 会显复杂
# include<iostream> # include<algorithm> # include<stdio.h> # include<string> using namespace std; int main() { char s[35000],fuhao1,fuhao2,zs[5]; int i,zhi=0,j,h=0,k=0,flag=0,tn = 1; int zhishu; string a; cin>>a; fuhao1 = a[0]; if(fuhao1=='+') //分段输出----------符号 { } else { cout<<"-"; } for(i=1;i<a.length();i++) //利用flag 将字符串a分成 主体数字字符串 、指数符号、 指数字符串 三个部分 { if(a[i]=='E') { flag = 1; continue; } if(flag==0) { s[11000+h] = a[i]; h++; } else if(flag == 1) { fuhao2 = a[i]; flag = 2; continue; } else { zs[k]=a[i]; k++; } } for(i=k-1;i>=0;i--) //将指数字符串 转化为 整数形式 { zhi = zhi + (zs[i]-'0')*tn; tn = tn * 10; } if(fuhao2=='+') //如果指数前的符号为正 分为3种可能 小数点仍存在 小数点刚好消失 小数点消失且要加0 { if(h>zhi+2) { char t; t = s[11001]; //保存小数点 for(i=0;i<zhi;i++) //数组循环前移,覆盖住了小数点的位置 { s[11001+i] = s[11002+i]; } s[11001+zhi] = t; //将小数点 放在数组前移后留下的最后一个位置 for(i=0;i<h;i++) { cout<<s[11000+i]; } } else if(h==zhi+2) { for(i=0;i<h;i++) { if(i==1) { continue; } cout<<s[11000+i]; } } else { for(i=0;i<h-2;i++) //数组循环前移覆盖小数点 { s[11001+i] = s[11002+i]; } zhishu = zhi -h + 2; for(j=0;j<zhishu;j++) { s[11002+i-1+j] = '0'; //加0 } for(i=0;i<=zhi;i++) { cout<<s[11000+i]; } } } else { char t; t = s[11000];s[11000]=s[11001];s[11001]=t; cout<<"0."; for(i=1;i<zhi;i++) { cout<<"0"; } for(i=1;i<h;i++) { cout<<s[11000+i]; } } return 0; }