惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
月光博客
月光博客
博客园_首页
博客园 - 叶小钗
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
量子位
小众软件
小众软件
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
IT之家
IT之家
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
G
Google Developers Blog
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
PAT乙级 1024.科学计数法|OhYee 博客
2018-06-30 · via OhYee 博客

这是一篇最后编辑于 8 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

题目

原题链接

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

解析

按照小数点向左向右移位即可。
多出几组各种各样的测试样例,基本上能试出来所有的问题

代码

C++解法

#include <cmath>
#include <cstdio>
#include<cstring>
const int maxn = 10010;

char s[maxn];
char base[maxn];

/*
    Find the first character c in the string s.
    Arguments:
        s   -   string
        len -   length of s
        c   -   the character to find
    Return:
        The position of the character in the string.
        If cann't find the character, return -1.
*/
int findChar(char *s,int len,char c){
    int pos = -1;
    for(int i=0;i<len;++i){
        if(s[i] == c){
            pos = i;
            break;
        }
    }
    return pos;
}

/*
    Erase the nonnumeric character.
    Arguments:
        s   -   raw string.
        len -   length of s.
    Return:
        Length of the string.
*/
int eraseNonChar(char *s, int len) {
    int pos=0;
    for (int i=0;i<len;++i){
        if(s[i]>='0'&&s[i]<='9')
            s[i-pos] = s[i];
        else
            ++pos;    
    }
    s[len-pos]='\0';
    return len-pos;
}

/*
    String to integer
    Arguments:
        s       -   string
        bpos    -   begin position
        epos    -   end position
    Return:
        The integer
*/
int toInt(char *s, int bpos,int epos){
    int fix = 1;
    int num=0;
    for(int i=bpos;i<epos;++i){
        if (i==bpos && (s[i]=='+'||s[i]=='-')){
            if(s[i]=='-')
                fix = -1;
        }else{
            if(s[i]>='0'&&s[i]<='9')
                num=num*10+s[i]-'0';
        }
    }
    return num*fix;
}

/*
    Get the sub-string
    Arguments:
        dst     -   destination string
        src     -   source string
        bpos    -   begin position
        epos    -   end position
    Return:
        The integer
*/
void subString(char *dst, char *src, int bpos, int epos){
    //memcpy(dst,src+bpos,(epos-bpos)*sizeof(char));
    
    //printf("%s %d %d\n",src,bpos,epos);
    for(int i = 0;i < epos-bpos;++i)
        dst[i] = src[i+bpos];
    dst[epos-bpos]='\0';
    
}

int main() {
    scanf("%s",s);
    int len  = strlen(s);
    int ePos = findChar(s,len,'E');
    bool fix = false;

    subString(base,s,0,ePos);
    fix = (base[0]=='-');
    int baseLen = eraseNonChar(base,strlen(base));
    int exponent = toInt(s,ePos+1,len);
    
    // printf("%c %s %d\n",(fix?'-':'+'),base,exponent);
    
    if(baseLen==1 && base[0]=='0') {
        printf("0");
    } else {
        if(fix)
            printf("-");
        if(exponent<0){
            for(int i=0;i<-exponent;++i){
                printf("0");
                if(i==0)
                    printf(".");
            }
            printf("%s",base);
        }else{
            bool isFirst = true;
            for(int i=0;i<baseLen;++i){
                if(!isFirst || base[i]!='0'){
                    printf("%c",base[i]);
                    isFirst = false;
                }
                if(exponent==i && i!=baseLen-1)
                    printf(".");
            }
            for(int i=0;i<=exponent-baseLen;++i)
                printf("0");
        }
    }
    printf("\n");
    return 0;
}