每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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
解决方法:
(1)算法的基本思想:
以标志位 E 为科学计数法格式的分隔位,将其分成符号位、数字部分和指数部分。
因输入有正负号、数字、小数点和大写字母,故采用字符串存储。
先判断符号位 s[0] ,如果为负,则输出负号,反之,不输出。
将指针 i 指向标志位 E ,并将字符串切割, s[1] 至 s[ i -1 ]为数字部分,s[ i + 1] 至 s[ length - 1]为指数部分。
将分割后的字符串分为以下三种情况进行处理:
指数为负:
①小数点前移,需先打印“ 0. ”,在小数部分前面补 |n| - 1个 0 ,然后将小数部分补在后面(遇到小数点时,跳过)。
例如:
Input:+1.23400E-03 str = 1.23400 n = -3
Output:0.00123400
指数为正:
②指数很大,需要在数字部分后面补 0 。
例如:
Input:-1.2E-10 str = 1.2 n = -10
Output:-12000000000
③指数很小,小数点需后移。
例如:
Input:-1.23456E+03 str = 1.23456 n = +03
Output:-1234.56
(2)代码实现:
#include
#include
using namespace std;
//灰灰考研@一航代码
int main(){
string s;
cin >> s;
int i = 0;
while (s[i] != 'E')
i++; //记录E的位置
if (s[0] == '-')
cout <0]; //将负号输出
//截取符号位至指数E标志位中间的数字部分
string str = s.substr(1, i - 1);
int n = std::__cxx11::stoi(s.substr(i + 1));
/* +1.23400E-03 str = 1.23400 n = -3 */
if (n 0)
{ //指数为负
cout <"0.";
for (int i = 0; i abs(n) - 1; i++)
cout <'0';
for (int i = 0; i if (str[i] != '.')
cout < }
else//指数为正
{
if (n >= str.length() - 2)
{ //指数数值大
/*-1.2E+10 str = 1.2 n = 10 */
for (int i = 0; i if (str[i] != '.')
cout < for (int i = 0; i 2); i++)
cout <'0';
}
else
{ //指数数值小
/*-1.23456E+03 str = 1.23456 n = 3 */
cout <0];
int cnt = 0, i;
for (i = 2; cnt cout < cout <'.';
for (;i cout < }
}
system("pause");
return 0;
}
明日预告:程序运行时间
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。
这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。
输入格式:
输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,107]。
输出格式:
在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss
(即2位的 时:分:秒
)格式输出;不足 1 秒的时间四舍五入到秒。
输入样例:
123 4577973
输出样例:
12:42:59