PAT乙级1024

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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

 

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
string str;
int main()
{
    cin>>str;
    int length=str.length();
    int z;
    if(str[0]=='-')
        z=-1;
    else
        z=1;
    int dot=0,e=0,eh=0;
    //int length=str.length();
    for(int i=0;i<length;i++)
    {
        if(str[i]=='.')dot=i;
        if(str[i]=='E')e=i;
    }
    int t=0,sum=0;

    for (int i = length-1; i >=e+2 ; i--) {
        sum+=(str[i]-'0')*pow(10,t);
        t++;
    }
    int h=0;
    if(str[e+1]=='-')h=-1;
    else h=1;
    if(z==-1)cout<<"-";
    if(h==-1)
    {
        if(str[1]=='0')
        {
             cout<<"0.";
             //cout<<sum;
             //cout<<dot;
             for(int i=0;i<sum;i++)
                 cout<<"0";
             for(int i=dot+1;i<length;i++)
             {
                 if(str[i]=='E')break;
                 else
                     cout<<str[i];
             }
        }
        else
        {
            int num=dot-1;
            if(sum<num){
                //int dott=num-sum;
                for(int i=1;i<=dot-sum-1;i++)
                {
                    cout<<str[i];
                }
                cout<<".";
                for(int i=dot-sum;i<length;i++){
                    if(str[i]=='.')continue;
                    else if(str[i]=='E')break;
                    else cout<<str[i];
                }
            } else{
                cout<<"0.";
                for(int i=0;i<sum-num;i++)
                    cout<<"0";
                for(int i=1;i<length;i++)
                {
                    if(str[i]=='.')continue;
                    else if(str[i]=='E')break;
                    else
                        cout<<str[i];
                }
            }
        }
    } else
    {
        int mid=e-dot-1;
        //cout<<sum<<" "<<mid;
        if(str[1]=='0'){
            if(mid>=sum){
            int flag=0;
            for(int i=dot+1;i<=dot+sum;i++){
                if(str[i]!='0'){
                    flag=1;
                    cout<<str[i];
                }
            }
            if(flag==0)cout<<"0";
            if(mid!=sum)
             cout<<".";
            for(int i=dot+sum+1;i<=e-1;i++)
                cout<<str[i];
            }
            else{
               for(int i=1;i<length;i++) {
                   if (str[i] == 'E')break;
                   else if (str[i] == '.')continue;
                   else {
                       if (str[i] != '0')cout << str[i];
                   }
               }
                       int h=sum-mid;
                       for(int i=0;i<h;i++)cout<<"0";
                   }
        }
        else
        {
            if(mid<=sum)
            {
                for(int i=1;i<length;i++)
                {
                    if(str[i]=='.')continue;
                    else if(str[i]=='E')break;
                    else
                        cout<<str[i];
                }
                for(int i=0;i<sum-mid;i++)
                    cout<<"0";
            } else
            {
                for(int i=1;i<length;i++)
                {

                    if(str[i]=='.')continue;
                    else if(str[i]=='E')break;
                    else
                       cout<<str[i];
                    if(i==dot+sum)cout<<".";
                }
            }
        }
    }
    //cout<<sum<<" "<<e<<" "<<length;
    return 0;

}

看到网上一些题解过了所有测试点,但是还是有bug,我来答一波自认为满分的题解,欢迎hack。

posted @ 2019-08-17 15:33  zuiaimiusi  阅读(141)  评论(0编辑  收藏  举报