1024 科学计数法

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include<string>
using namespace std;

int main()
{
    string a;
    cin>>a;
    int len=a.length();
    int flag=1;
    int t=a.find("+",1);
    if(t==a.npos)
    {
        flag=0;
        t=a.find("-",1);
    }
    int tt=a.find(".",0);
    int flag1=1;
    if(tt==a.npos)
    {
        flag1=0;
    }
    int b=1;
    int c=0;
    for(int i=0;i<(len-t-1);i++)
    {
        c+=(a[len-i-1]-48)*b;
        b=b*10;
    }
    if(a[0]=='-'&&a[1]=='0'&&a[2]=='E')
    {
        cout<<"0";
    }
    else if(flag==0&&flag1==1)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        cout<<"0.";
        for(int j1=0;j1<c-1;j1++)
        {
            cout<<"0";
        }
        cout<<a[1];
        for(int j2=3;j2<t-1;j2++)
        {
            cout<<a[j2];
        }
    }
    else if(flag==1&&flag1==1)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        if(c>t-4)
        {
            cout<<a[1];
            for(int j3=3;j3<t-1;j3++)
            {
                cout<<a[j3];
            }
            for(int j4=0;j4<c-t+4;j4++)
            {
                cout<<"0";
            }
        }
        else if(c<t-5)
        {
            cout<<a[1];
            for(int j5=0;j5<c;j5++)
            {
                cout<<a[j5+3];
            }
            cout<<".";
            for(int j6=c+4;j6<t-1;j6++)
            {
                cout<<a[j6];
            }
        }
        else if(c==t-4)
        {
            cout<<a[1];
            for(int j5=0;j5<c;j5++)
            {
                cout<<a[j5+3];
            }
        }
    }
    else if(flag==1&&flag1==0)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        cout<<a[1];
        for(int j7=0;j7<c;j7++)
        {
            cout<<"0";
        }
    }
    else if(flag==0&&flag1==0)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        cout<<"0."<<a[1];
        for(int j8=0;j8<c-1;j8++)
        {
            cout<<"0";
        }
    }
    return 0;
}

别人:
分析:

本题处理起来确实麻烦,但你是不需要字符串函数来处理的。首先你需要找到E的位置,从E的位置+1往后计算指数大小EX,EX就表示需要在小数部分前或后加EX个0,然后判断第1个字符是不是负号,是则输出。再判定EX即0的长度是否为0,如果为0则输出从1开始到E之前位置的字符即可,如果EX不为0,则有如下两种情况:

1.EX>0

首先输出整数部分,然后需要判定小数部分长度和EX的大小,又分两种情况:

1.1 EX<小数部分长度

输出下标从3即小数部分第1个数字的位置开始EX个长度的字符,如果用for循环输出,假设循环变量为j,EX也即0的长度为len0,则条件为j=3,j<3+len0,j++,注意,3+len0不要写成j=j+len0!否则j的上限不断变化,到时候可能会越界!然后输出小数点,再输出小数点到E之间的部分,注意循环变量的初始值为3+len0

1.2 EX>=小数部分长度

先输出从下标3开始到E的部分,假设小数部分长度为D,则输出EX-D个长度的0

2.EX<0

先输出0和小数点,再输出EX-1长度的0,再输出原整数部分即第2个字符,再输出下标从3开始到E的部分

#include <iostream>
#include<string>
using namespace std;

int main()
{
    string a;
    cin>>a;
    int len=a.length();
    int flag=1;
    int t=a.find("+",1);
    if(t==a.npos)
    {
        flag=0;
        t=a.find("-",1);
    }
    int tt=a.find(".",0);
    int flag1=1;
    if(tt==a.npos)
    {
        flag1=0;
    }
    int b=1;
    int c=0;
    for(int i=0;i<(len-t-1);i++)
    {
        c+=(a[len-i-1]-48)*b;
        b=b*10;
    }
    if(a[0]=='-'&&a[1]=='0'&&a[2]=='E')
    {
        cout<<"0";
    }
    else if(flag==0&&flag1==1)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        cout<<"0.";
        for(int j1=0;j1<c-1;j1++)
        {
            cout<<"0";
        }
        cout<<a[1];
        for(int j2=3;j2<t-1;j2++)
        {
            cout<<a[j2];
        }
    }
    else if(flag==1&&flag1==1)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        if(c>t-4)
        {
            cout<<a[1];
            for(int j3=3;j3<t-1;j3++)
            {
                cout<<a[j3];
            }
            for(int j4=0;j4<c-t+4;j4++)
            {
                cout<<"0";
            }
        }
        else if(c<t-5)
        {
            cout<<a[1];
            for(int j5=0;j5<c;j5++)
            {
                cout<<a[j5+3];
            }
            cout<<".";
            for(int j6=c+4;j6<t-1;j6++)
            {
                cout<<a[j6];
            }
        }
        else if(c==t-4)
        {
            cout<<a[1];
            for(int j5=0;j5<c;j5++)
            {
                cout<<a[j5+3];
            }
        }
    }
    else if(flag==1&&flag1==0)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        cout<<a[1];
        for(int j7=0;j7<c;j7++)
        {
            cout<<"0";
        }
    }
    else if(flag==0&&flag1==0)
    {
        if(a[0]=='-')
        {
            cout<<"-";
        }
        cout<<"0."<<a[1];
        for(int j8=0;j8<c-1;j8++)
        {
            cout<<"0";
        }
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值