B1024

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
using namespace std;

const int maxn=10010;
char s[maxn],str[maxn],xi[maxn];

int main()
{
    scanf("%s",s);
    char sign;
    int exp=0,len=strlen(s),index=0,dot,xiao;
    for(int i=0;i<len;i++){
        if(s[i]=='.') dot=i;
        else if(s[i]!='E'){
            xi[index++]=s[i];
        }
        if(s[i]=='E'){
            xiao=i-dot-1;
            sign=s[i+1];
            i+=2;
            while(s[i]=='0') i++;
            int t=1;
            for(int j=len-1;j>=i;j--){
                exp+=(s[j]-'0')*t;
                t*=10;
            }
            break;
        }
    }
    if(sign=='+'){
        dot+=exp;
        if(xi[0]=='-')
            printf("-");
        for(int i=1;i<index;i++){
            if(i==dot && dot<=index-1)
                printf(".");
            printf("%c",xi[i]);
        }
        for(int i=1;i<=exp-xiao;i++) printf("0");
    }else{
        if(xi[0]=='-')
            printf("-");
        dot-=exp;
        int zheng=index-xiao-1;
        if(zheng<=exp) printf("0.");
        for(int i=1;i<=exp-zheng;i++) printf("0");
        for(int i=1;i<index;i++){
            if(i==dot && dot>=2)
                printf(".");
            printf("%c",xi[i]);
        }
    }
    return 0;
}
 

这里最好根据指数的正负来分别做判断,先循环一次,得到指数数值,小数点位置,小数位数以及不包含小数点的系数数组(这两个也可以不用,并且题目输入点貌似没有指数为0的情况,上面有部分代码是有点多余了。),然后如果指数是正的小数点右移,分为两部分来写,一部分是输出原来的系数数组并把小数点位置找好,另一部分补0,注意小数点如果右移到原系数最后一位则不需要加了。然后考虑指数为负数的情况,即小数点左移(我这里没注意科学计数法整数只有一位数,所以多写了一点东西,可以去掉。。。直接输出0.就可以了),然后也是分为两部分,先补0,然后输出系数数组就行了。

这里最后要注意一下,输出的时候如果是正数那么输入串第一个+号不要输出。

然后这道题和A1073是一样的,我把我以前写的代码贴上去了。(当时有些输入点一直过不了,参考了一下书上才全过的。所以会简洁一点)。

最后给几个书上的测试点可以测试一下:

+3.1415E+004        //31415

-3.1415926E+4    //-31415.926

+3.1415926E-01   //0.31415926

-3.1415926E-0005  //-0.000031415926

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值