首页
学习
活动
专区
圈层
工具
发布
30 篇文章
1
PAT (Basic Level) Practice (中文)1054 求平均值 (20 分)
2
PAT (Basic Level) Practice (中文)1051 复数乘法 (15 分)
3
PAT (Basic Level) Practice (中文)1050 螺旋矩阵 (25 分)
4
PAT (Basic Level) Practice (中文)1046 划拳 (15 分)
5
PAT (Basic Level) Practice (中文)1045 快速排序 (25 分)
6
PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
7
PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
8
PAT (Basic Level) Practice (中文)1042 字符统计 (20 分)
9
PAT (Basic Level) Practice (中文)1040 有几个PAT (25 分)
10
PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
11
PAT (Basic Level) Practice (中文)1036 跟奥巴马一起编程 (15 分)
12
PAT (Basic Level) Practice (中文)1034 有理数四则运算 (20 分)
13
PAT (Basic Level) Practice (中文)1032 挖掘机技术哪家强 (20 分)
14
PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
15
PAT (Basic Level) Practice (中文)1030 完美数列 (25 分)
16
PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
17
PAT (Basic Level) Practice (中文)1028 人口普查 (20 分)
18
PAT (Basic Level) Practice (中文)1027 打印沙漏 (20 分)
19
PAT (Basic Level) Practice (中文)1025 反转链表 (25 分)
20
PAT (Basic Level) Practice (中文)1053 住房空置率 (20 分)
21
PAT (Basic Level) Practice (中文)1024 科学计数法 (20 分)
22
PAT (Basic Level) Practice (中文)1022 D进制的A+B (20 分)
23
PAT (Basic Level) Practice (中文)1049 数列的片段和 (20 分)
24
PAT (Basic Level) Practice (中文)1021 个位数统计 (15 分)
25
PAT (Basic Level) Practice (中文)1048 数字加密 (20 分)
26
PAT (Basic Level) Practice (中文)1019 数字黑洞 (20 分)
27
PAT (Basic Level) Practice (中文)1017 A除以B (20 分)
28
PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
29
PAT (Basic Level) Practice (中文)1015 德才论 (25 分)
30
PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)

PAT (Basic Level) Practice (中文)1024 科学计数法 (20 分)

1024 科学计数法 (20 分)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:

代码语言:javascript
复制
+1.23400E-03

输出样例 1:

代码语言:javascript
复制
0.00123400

输入样例 2:

代码语言:javascript
复制
-1.2E+10

输出样例 2:

代码语言:javascript
复制
-12000000000

好坑的细节题

首先:第一位符号位无所谓,正号不输出,负号输出‘-’ ,正和负的情况一样

判断E的后面是+还是-,如果是-的话比较好办,因为只有一种情况,小数点左边一定是零,其他细节模拟一下~

+号的话稍微麻烦一点,分两种情况:结果还存在小数点和要在末尾添上对应的零,可以详细自己动手模拟一下~

代码语言:javascript
复制
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#include<unordered_set>
#define rg register ll
#define inf 2147483647
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define ll long long
#define maxn 300005
#define lb(x) (x&(-x))
const double eps = 1e-6;
using namespace std;
inline ll read()
{
	char ch = getchar(); ll s = 0, w = 1;
	while (ch < 48 || ch>57) { if (ch == '-')w = -1; ch = getchar(); }
	while (ch >= 48 && ch <= 57) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
	return s * w;
}
inline void write(ll x)
{
	if (x < 0)putchar('-'), x = -x;
	if (x > 9)write(x / 10);
	putchar(x % 10 + 48);
}
string s;
int main()
{
    cin>>s;
    if(s[0]=='-')
    {
        cout<<'-';
        rg i=0,j=0;
        while(s[i]!='.')i++;
        while(s[j]!='E')j++;
        if(s[j+1]=='-')
        {
            rg sum=0;
            for(rg k=j+2;s[k];k++)
            {
                sum=sum*10+s[k]-48;
            }
            if(sum==0)
            {
                for(rg k=1;s[k]!='E';k++)
                {
                    cout<<s[k];
                }
                return 0;
            }
            else
            {
               cout<<"0.";
                for(rg i=1;i<=sum-1;i++)cout<<0;
                for(rg i=1;s[i]!='E';i++)
                {
                    if(s[i]=='.')continue;
                    else cout<<s[i];
                }
            }
        }
        else
        {
             rg sum=0;
            for(rg k=j+2;s[k];k++)
            {
                sum=sum*10+s[k]-48;
            }
            if(sum==0)
            {
                for(rg k=1;s[k]!='E';k++)
                {
                    cout<<s[k];
                }
                return 0;
            }
            else
            {
                rg tep=1;
                while(s[tep]=='0')tep++;
                //cout<<tep<<endl;
                //cout<<s[tep];
                ll check=j-i-1;
                if(check>sum)
                {
                    cout<<s[1];
                    ll flag=0;
                    //cout<<sum<<endl;
                    for(rg i=1;i<=sum;i++)
                    {
                        cout<<s[i+2];
                    }
                    cout<<'.';
                    for(rg i=sum+3;s[i]!='E';i++)cout<<s[i];
                }
                else
                {
                    ll flag=0;
                    //cout<<'a'<<endl;
                    for(rg i=tep;s[i]!='E';i++)
                    {
                        if(s[i]=='.')
                        {
                            continue;
                        }
                        cout<<s[i];
                    }
                    for(rg i=1;i<=sum-check;i++)cout<<0;
                }
            }
        }
    }
    else
    {
        rg i=0,j=0;
        while(s[i]!='.')i++;
        while(s[j]!='E')j++;
        if(s[j+1]=='-')
        {
            rg sum=0;
            for(rg k=j+2;s[k];k++)
            {
                sum=sum*10+s[k]-48;
            }
            if(sum==0)
            {
                for(rg k=1;s[k]!='E';k++)
                {
                    cout<<s[k];
                }
                return 0;
            }
            else
            {
               cout<<"0.";
                for(rg i=1;i<=sum-1;i++)cout<<0;
                for(rg i=1;s[i]!='E';i++)
                {
                    if(s[i]=='.')continue;
                    else cout<<s[i];
                }
            }
        }
        else
        {
             rg sum=0;
            for(rg k=j+2;s[k];k++)
            {
                sum=sum*10+s[k]-48;
            }
            if(sum==0)
            {
                for(rg k=1;s[k]!='E';k++)
                {
                    cout<<s[k];
                }
                return 0;
            }
            else
            {
                rg tep=1;
                while(s[tep]=='0')tep++;
                //cout<<tep<<endl;
                //cout<<s[tep];
                ll check=j-i-1;
                if(check>sum)
                {
                    cout<<s[1];
                    ll flag=0;
                    //cout<<sum<<endl;
                    for(rg i=1;i<=sum;i++)
                    {
                        cout<<s[i+2];
                    }
                    cout<<'.';
                    for(rg i=sum+3;s[i]!='E';i++)cout<<s[i];
                }
                else
                {
                    ll flag=0;
                    //cout<<'a'<<endl;
                    for(rg i=tep;s[i]!='E';i++)
                    {
                        if(s[i]=='.')
                        {
                            continue;
                        }
                        cout<<s[i];
                    }
                    for(rg i=1;i<=sum-check;i++)cout<<0;
                }
            }
        }
    }
   	return 0;
}
下一篇
举报
领券