版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址
http://blog.****.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。