版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址
http://blog.csdn.net/lzuacm

PAT Basic level 1024 科学计数法转化为普通数字

在线提交 - 牛客网:
https://www.nowcoder.com/pat/6/problem/4050

PTA (拼题A) | 程序设计类实验辅助教学平台(原PAT)
https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168

科学计数法 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)

题目描述

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]”.”[0-9]+E[+-][0-9]+,即数字的整数部分。

只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。

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


输入描述:

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


输出描述:

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


输入例子:

+1.23400E-03

输出例子:

0.00123400


输入样例:

+1.43500E+10
-1.2E+10
+5.6300E+539

输出样例:

14350000000
-12000000000
563000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

思路:
按照题意,满足要求的数形如: ±4.36E±05。

可更具体地表示为:±unsignDoubleE±0…0unsignInt (当然此处的int是long long的, 或int64的,而0…0是若干个连续的0)。事实上 ±unsignDouble可以直接看作double(记作part1),±0…0unsignInt可直接看作int(记作part2)。

已AC代码:

using System;
using System.Linq;

namespace LeetCode65_Valid_Number
{
    class Program
    {
        public class Solution
        {
            public string ToNum(string s)
            {
                string num = String.Empty;

                // s = s.Trim();
                string[] arr = s.Split('E');
                int LastZeroCountInPart1 = 0;
                foreach (char ch in arr[0].Reverse())
                {
                    if (ch == '0')
                        LastZeroCountInPart1++;
                    else
                    {
                        break;
                    }
                }

                bool isPart1Double = double.TryParse(arr[0], out var part1);
                int decimalDigitCountInPart1 = arr[0].IndexOf('.') == -1 ? 0 : arr[0].Length - 1 - arr[0].IndexOf('.');

                string newPart2 = arr.ElementAtOrDefault(1);
                bool isPart2Int = int.TryParse(newPart2, out var part2);
                if (arr.Length == 1)
                {
                    if (isPart1Double)
                        num = part1.ToString();
                }
                if (arr.Length == 2)
                {
                    if (part2 < 0 || part2 - decimalDigitCountInPart1 < 0)
                    {
                        if (isPart1Double && isPart2Int)
                            num = Decimal.Parse((part1 * Math.Pow(10, part2)).ToString(), System.Globalization.NumberStyles.Float).ToString(); // 此时Math.Pow(10, part2)并不会越界,故可使用Decimal.Parse从scientific num转换为real num
                    }
                    else if (part2 - decimalDigitCountInPart1 >= 0)
                    {
                        num = part1.ToString().Replace(".", "") + new String('0', part2 - decimalDigitCountInPart1);  // 避免越界,此处使用字符串拼接代替Math.Pow(10, part2),拼接还可用StringBuilder的append方法
                    }

                }

                return num + new String('0', LastZeroCountInPart1); // 此处拼接还可使用StringBuilder的append方法
            }
        }

        static void Main(string[] args)
        {
            Solution sol = new Solution();
            string str;
            while ((str = Console.ReadLine()) != null)
            {
                Console.WriteLine(sol.ToNum(str));
            }
        }
    }
}

Rank:

ps:
奇怪的是,该代码在牛客网上AC了,但在PTA上显示”部分正确”(得分17/20),而且PTA使用的是C#6.0编译器,牛客网支持C#7.0。