百度有一款非常方便的在线应用——科学计算器。这个计算器可以接受科学记数法表示的数作为输入。
在科学记数法中,一个数被写成一个实数 aaa 与一个 101010 的 nnn 次幂的积:
a∗10na * 10 ^ na∗10n
其中 nnn 是一个整数,aaa 是一个实数且 1≤∣a∣<101 \leq |a| < 101≤∣a∣<10。在计算器的输入中,使用 eee 来表示 101010 的幂。比如
1.5e5
的值为 1.5∗1051.5 * 10^51.5∗105。
3.2e-6
的值为 3.2∗10−63.2 * 10^{-6}3.2∗10−6。
科学计算器在进行计算之前,要先对用户输入的数进行简化。简化的过程是将科学记数法表示的数转换成与之等价的长度 最短 的科学记数法表示。
输入格式
输入只有一行,输入一个长度不超过 100100100 的科学记数法表示的浮点数。保证输入的合法性。
输出格式
输出一行,表示简化后的科学记数法表示的浮点数。
样例输入1
02.0e-5
样例输出1
2e-5
样例输入2
+1.101e+00
样例输出2
1.101e0
提示信息
请确保输出的结果也依然是合法的科学记数法表示。
思路:e的两端是两个需要去掉前导0和后置0的两个数,我分成了两种情况考虑,一种是带小数点的浮点数处理,也分成两部分去做,一个是小数点前的去前导0,一个是去小数点后的后置0。然后将两个串都处理了,输出。另一种是没有小数点的数处理,这个不需要处理后置0的问题,只需要处理前导0即可。
注意处理符号。
AC代码:
#include<stdio.h>
#include<string.h>
using namespace std;
char a[5000];
char ans[5000];
char ans2[5000];
int main()
{
while(~scanf("%s",a))
{
int n=strlen(a);
int mid;
for(int i=0;i<n;i++)
{
if(a[i]=='e')
{
mid=i;break;
}
}
int biaoji=-1;
for(int i=0;i<mid;i++)
{
if(a[i]=='.')
{
biaoji=i;
}
}
if(biaoji==-1)
{
int flag=0;
int ffff=0;
for(int i=0;i<mid;i++)
{
if(a[i]=='-')
{
flag=1;
continue;
}
if(ffff==0&&a[i]=='0')continue;
else
{
ffff=1;
if(a[i]=='+')
{
ffff=0;
continue;
}
if(flag==1)
{
printf("-");
flag=0;
}
printf("%c",a[i]);
}
}
}
else
{
int ffff=0;
int flag=0;
for(int i=0;i<biaoji;i++)
{
if(a[i]=='-')
{
flag=1;
continue;
}
if(ffff==0&&a[i]=='0'&&a[i+1]!='.')continue;
else
{
ffff=1;
if(a[i]=='+')
{
ffff=0;
continue;
}
if(flag==1)
{
flag=0;
printf("-");
}
printf("%c",a[i]);
}
}
ffff=0;
char ans[500];
int cont=0;
for(int i=mid-1;i>biaoji;i--)
{
if(ffff==0&&a[i]=='0')continue;
else
{
ffff=1;
if(a[i]=='+')
{
ffff=0;
continue;
}
ans[cont++]=a[i];
}
}
if(ffff==1)
printf(".");
for(int i=cont-1;i>=0;i--)
{
if(ans[i]=='+')continue;
printf("%c",ans[i]);
}
}
printf("e");
biaoji=-1;
///after e
for(int i=mid;i<n;i++)
{
if(a[i]=='.')biaoji=i;
}
if(biaoji==-1)
{
int flag=0;
int ffff=0;
for(int i=mid+1;i<n;i++)
{
if(a[i]=='-')
{
flag=1;
continue;
}
if(a[i]=='0'&&ffff==0)continue;
else
{
ffff=1;
if(a[i]=='+')
{
ffff=0;
continue;
}
if(flag==1)
{
printf("-");
flag=1;
}
printf("%c",a[i]);
}
}
if(ffff==0)
{
printf("0");
}
printf("\n");
}
else
{
int gg1=0;
int fff=0;
int flag=0;
for(int i=mid+1;i<biaoji;i++)
{
if(a[i]=='-')
{
flag=1;continue;
}
if(a[i]=='+')continue;
if(fff==0&&a[i]=='0'&&a[i+1]!='.')continue;
else
{
if(flag==1)
{
printf("-");
flag=0;
}
fff=1;
gg1=1;
printf("%c",a[i]);
}
}
fff=0;
char ans[500];
int cont=0;
for(int i=n-1;i>biaoji;i--)
{
if(fff==0&&a[i]=='0')continue;
else
{
fff=1;
if(a[i]=='+')
{
fff=0;
continue;
}
ans[cont++]=a[i];
}
}
int gg=0;
if(fff==1)
{
printf(".");
for(int i=cont-1;i>=0;i--)
{
if(ans[i]=='+')continue;
gg=1;
printf("%c",ans[i]);
}
}
if(gg==0&&gg1==0)
{
printf("0");
}
printf("\n");
}
}
}