2016计蒜之道初赛第三场----百度的科学计算器【模拟】

百度有一款非常方便的在线应用——科学计算器。这个计算器可以接受科学记数法表示的数作为输入。

在科学记数法中,一个数被写成一个实数 aaa 与一个 101010nnn 次幂的积:

a∗10na * 10 ^ na10n

其中 nnn 是一个整数,aaa 是一个实数且 1≤∣a∣<101 \leq |a| < 101a<10。在计算器的输入中,使用 eee 来表示 101010 的幂。比如

1.5e5的值为 1.5∗1051.5 * 10^51.5105

3.2e-6的值为 3.2∗10−63.2 * 10^{-6}3.2106

科学计算器在进行计算之前,要先对用户输入的数进行简化。简化的过程是将科学记数法表示的数转换成与之等价的长度 最短 的科学记数法表示。

输入格式

输入只有一行,输入一个长度不超过 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");
        }
    }
}

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值