模拟题 —— 字符串拔高题2(PAT 乙级 1024 科学计数法 (20分) )

模拟题介绍

入门模拟题 分为简单模拟,查找元素,图形输出,日期处理,进制转换字符串处理等等!

何为模拟题?

模拟题是一类“题目怎么说,你就怎么做的”的一类题目。此类题目不涉及算法,完全根据题目描述进行代码的编写,主要考察代码能力!!!

模拟题 ———— 字符串处理(拔高题)
【PAT 乙级 B 1024】 科学计数法 (20分)

字符串处理问题很能体现代码能力的一种题型,一般实现逻辑会非常麻烦
而且可能会有很多的细节和边界情况,因此对代码能力弱的会有较大难度
但这也是进阶大神的必经之路。

唯一的方法:多做多想积累经验!!!

题目链接 - PAT B 1024 科学计数法 (20分)

题目描述

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

题目说明

你是否一头雾水而不知何处下手?(其实我一开始也是这样的,后来我选择克服它,我不信我做不出来)
该题其实难度相对于PAT 甲级 1082 Read Number in Chinese (25分)
相当简单啦!
有兴趣可以看题解 :1082 Read Number in Chinese (25分)

为什么简单呢?因为讨论的情况较少

题解思路

题意:
将科学计数法的形势变成不是科学计数法的形式,关于如何变,题目已经很清楚啦!

三种情况讨论:

  1. 当指数为正数,且该指数未超过该小数的小数点后的位数,那么小数点是保留的
    比如 +1.23400E+03 ,结果为1234.00

  2. 当指数为正数,且该指数超过该小数的小数点后的位数,那么小数点是不保留的
    比如 +1.23400E+05 ,结果为123400

  3. 当指数负数,那么小数点是保留的,且在小数点添加0. 00…
    比如 +1.23400E-05 ,结果为0.0000123400
    比如 +1.23400E-03 ,结果为0.00123400
    规律:只需要在小数前添加0. 随后添加 (指数 - 1)个 0, 再将原来的小数去掉小数点后补上即可

题解过程

以+1.23400E+03 为例
首先将字符串的指数剥离开来存放到sum中
再使用两个字符变量分别来存储小数前的正负号和指数前的正负号
接着用b数组来存储小数部分
最后使用c数组来存储变化后的小数

题解代码

#include <cstdio>
#include <cstring>

char a[10005], b[10005],c[10005];
int main()
{
    gets(a);
    int sum = 0; int temp = 1;
    char ch1, ch2;
    int i;
    for (i = strlen(a) - 1; a[i] != '+' && a[i] != '-'; i--)
    {
        sum += (a[i] - '0') * temp;
        temp = 10 * temp;
    }//求sum大小
    ch2 = a[i];//指数正负号
    ch1 = a[0];//小数正负号
   
    int k = 0;
    for (int j = 1; j < i - 1; j++)
    {
        b[k++] = a[j];
    }//存储小数部分

    //----------------------------------
    int lentail = i - 4;//小数部分小数点后的长度
   
    //特殊情况处理一下
    if (ch1 == '-') printf("-");
    if (sum == 0) printf("%s", b);

    if (ch2 == '+') {//指数为正
        if (sum < lentail)//小于小数中小数点后的长度
        {
            int t = 0;
            int m;
            for ( m = 0; m <= sum + 1; m++)
            {
                if (b[m] == '.') continue;
                else {
                        c[t++] = b[m];
                }
            }
            c[t++] = '.';
            for (int n = m; n < strlen(b); n++)
                c[t++] = b[n];
            c[t] = '\0';
            printf("%s", c);
        }
        else {//大于小数点后的长度
            int t = 0;
            for (int m = 0; m < strlen(b); m++)
            {
                if (b[m] == '.') continue;
                else {
                        c[t++] = b[m];
                }
            }
            for (int n = 0; n < sum - lentail; n++)
                c[t++] = '0';
            c[t] = '\0';
            printf("%s", c);
        }
    }
    if (ch2 == '-'){//指数为负
        c[0] = '0';
        c[1] = '.';
        int t = 2;
        for (int m = 0; m < sum - 1; m++)
            c[t++] = '0';
        for (int n = 0; n < strlen(b); n++)
        {
            if (b[n] == '.') continue;
            c[t++] = b[n];
        }
        c[t] = '\0';
        printf("%s", c);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值