PAT乙级.1024. 科学计数法 (20)

本文介绍了一种将科学计数法转换为普通数字表示法的算法实现,适用于处理极大或极小数值。文章详细解析了处理流程,包括读取字符串、提取底数与指数、判断并处理正负指数情况等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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链接


思路:

1.读取字符串,将底数单独提取出来(滤去小数点)

    base[0] = str[1];   //获得小数点前的数字
    for( i =3; str[i] != 'E'; i++, len_base++)
    {
        base[len_base] = str[i];   //注意:len_base最后比实际多1
    }

2.提取指数字符,获得指数数字exp

    //获得指数数字
    i++;
    if(str[i] == '-')   flag = 1;
    for(i++; str[i] != '\0'; i++)
    {
        exp = exp*10;
        exp += str[i] - '0';
    }

3.exp为正,意味着小数点右移,比较exp 与 len_base-1,判断是否还需要输出小数点,然后分情况输出
4.exp为负,意味着小数点左移,要先输出“0.”计算还需要输出的0的个数,之后输出底数base

        if(flag)    //如果指数为负数,向右移位
        {
            printf("0.");
            while(--exp)    printf("0");
            for(int k = 0; k<len_base; k++)    printf("%c",base[k] );
        }

5.exp为0,不需要移位,直接输出


代码:

/**
* @tag     PAT_B_1024
* @authors R11happy (xushuai100@126.com)
* @date    2016-8-23 23:52-0:52
* @version 1.0
* @Language C++
* @Ranking  435/1515
* @function null
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>

int main(int argc, char const *argv[])
{
    int i, len_base=1;
    int index = 0;
    int exp = 0;
    int flag = 0;   //记录指数正负
    char str[10010];    //一个char 1 byte,9999byte 至少开10000
    char base[10010];
    gets(str);
    if(str[0] == '-')   printf("-");
    base[0] = str[1];   //获得小数点前的数字
    for( i =3; str[i] != 'E'; i++, len_base++)
    {
        base[len_base] = str[i];   //注意:len_base最后比实际多1
    }
    //获得指数数字
    i++;
    if(str[i] == '-')   flag = 1;
    for(i++; str[i] != '\0'; i++)
    {
        exp = exp*10;
        exp += str[i] - '0';
    }
    //如果exp不为0, 需要进行移位
    if(exp)
    {
        if(flag)    //如果指数为负数,向右移位
        {
            printf("0.");
            while(--exp)    printf("0");
            for(int k = 0; k<len_base; k++)    printf("%c",base[k] );
        }
        else    //指数为正数,向左移位
        {
            if(exp < len_base-1) //移位后还需要输出小数点
            {
                //注意index作用域,开始误写成int index = 0, 结果对输入
                //-3.1415926E+4会输出-31415.31415926
                for(index = 0; index<= exp; index++)    printf("%c",base[index] );
                printf(".");
                for(; index < len_base; index++)   printf("%c",base[index] );
            }
            else    //移位后不用输出小数点
            {
                for(int k = 0; k < len_base; k++)  printf("%c",base[k] );
                for(int k = 0 ; k < exp - len_base+1; k++)   printf("0");
            }
        }
    }
    //如果exp0,不用移位,直接输出
    else
    {
        for(int k = 1; str[k] != 'E'; k++)
            printf("%c",str[k] );
    }
    return 0;
}

收获:

1.一个char占1byte,9999byte至少要开char [10000]
2.注意i,j,k的作用域

### 关于PAT乙级1024题目的Python解法 对于PAT乙级1024题目,虽然未直接提及此具体编号的解答细节,但从相似类型的题目解析中可以获得一些启示。例如,在处理涉及链表反转的问题时,Python由于其简洁的语法特性能够提供较为直观的解决方案[^1]。 #### 链表节点定义 首先定义单向链表中的节点结构体: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` #### 构建链表并执行反转操作 接着构建一个辅助函数用于创建测试用例所需的链表实例,并编写实际负责反转逻辑的方法: ```python def build_linkedlist(values): dummy_head = current_node = ListNode() for v in values: current_node.next = ListNode(v) current_node = current_node.next return dummy_head.next def reverse_linkedlist(head: ListNode) -> ListNode: prev = None curr = head while curr is not None: temp_next = curr.next # Store the reference to the rest of original list. curr.next = prev # Reverse link direction at this node. prev = curr # Move forward one step on both pointers. curr = temp_next return prev # New head will be last non-null 'prev'. ``` 上述代码实现了基本的迭代方式来完成链表反转的任务。值得注意的是,尽管Python可能在性能上不如编译型语言如C++高效,特别是在面对复杂度较高的算法挑战时;但是借助合理的数据结构设计以及标准库的支持(比如`collections.deque`),仍然可以在很多场景下获得不错的效率表现[^4]。 为了验证这段程序的有效性,可以通过简单的例子来进行测试: ```python if __name__ == "__main__": test_values = [int(x.strip()) for x in "1 2 3".split()] ll = build_linkedlist(test_values) reversed_ll = reverse_linkedlist(ll) result = [] while reversed_ll: result.append(str(reversed_ll.val)) reversed_ll = reversed_ll.next print("->".join(result)) # Expected output: 3->2->1 ``` 通过这种方式不仅可以加深对基础概念的理解,同时也锻炼了解决实际问题的能力[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值