本题需提前了解科学记数法 科学记数法-百度百科
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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
思路:
① 接收数据:
借助 scanf 函数和正则表达式将输入的 数字正负号、实数部分、幂指数部分 分别储存在 char sign
char num[10010]
int po
中,对具体正则表达式解释如下:
正则表达式 | 含义 |
---|---|
%c | 接收字符格式(char) |
%[0-9.] | 接收数字和小数点 |
%*[E] | 丢弃大写字母E |
%d | 接收整数格式(int) |
③ 输出数据:
·首先判断数字的正负,正数则暂时不输出,负数则输出 -
负号
·幂指数 po
的正负决定小数点移动方向,据此分两种情况输出
·幂指数为正数或 0
,小数点向右移动 po
位,
整数部分足够的,输出 num[po + 2]
时用 .%d
的格式输出;
整数部分不够的,用 0
补齐;
·幂指数为负数,小数点向左移动 po
位
先输出 0.
再输出 po-1
个 0
,最后输出整数部分的数字(不输出小数点)
思路提示语句
#include<iostream>
using namespace std;
int main() {
int i = 0, po;
char sign, num[10010];
scanf("%c%[0-9.]%*[E]%d", &sign, num, &po);
if (sign == '-')
printf("-");
if (po < 0) {
printf("0.");
for (i=po+1; i < 0; i++)
printf("0");
for (i = 0; num[i] != '\0'; i++)
if (num[i] != '.')
printf("%c", num[i]);
}
if (po >= 0) {
printf("%c", num[0]);
for (i = 2; num[i] != '\0'; i++)
if (i == (po + 2))
printf(".%c", num[i]);
else printf("%c", num[i]);
if (i <= (po + 1))
for (; i <= po + 1; i++)
printf("0");
}
return 0;
}