科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
算法:
- 算法开始。
- 读取字符串。
- 扫描有效位数和指数
- 确定小数点位置。
- 分配足够空间,写入普通数字表示法表示的数字。
- 输出数字。
- 算法结束。
下列代码可成功运行于VS2015,修改scanf_s即可在PAT上运行。
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10000
int main(void) {
char originString[MAX];
int i, j, k, precision = 0, exponent = 0;
char p_sign, e_sign;
char* p;
scanf_s("%s", originString, MAX);
for (i = 0; toupper(originString[i]) != 'E'; i++) {
if (i == 0) {
p_sign = originString[i];
}
else if (isdigit(originString[i])) {
precision++;
}
}
while (i < (signed)strlen(originString)) {
if (originString[i] == '+' || originString[i] == '-') {
e_sign = originString[i];
}
else if (isdigit(originString[i])) {
exponent = exponent * 10 + originString[i] - '0';
}
i++;
}
p = (char*)malloc(sizeof(char)*(precision + exponent + 3));
if (e_sign == '-') {
if (exponent == 0) {
i = 0;
j = 0;
if (p_sign == '-') {
p[i++] = '-';
}
for (; toupper(originString[j]) != 'E'; j++) {
if (isdigit(originString[j]) || originString[j] == '.') {
p[i++] = originString[j];
}
}
p[i] = '\0';
}
else {
i = 0;
if (p_sign == '-') {
p[i++] = '-';
}
p[i++] = '0';
p[i++] = '.';
for (j = 0; j < exponent - 1; j++) {
p[i++] = '0';
}
for (j = 1; toupper(originString[j]) != 'E'; j++) {
if (originString[j] != '.') {
p[i++] = originString[j];
}
}
p[i] = '\0';
}
}
else {
if (precision - 1 <= exponent) {
i = 0;
if (p_sign == '-') {
p[i++] = '-';
}
for (j = 0; toupper(originString[j]) != 'E'; j++) {
if (isdigit(originString[j])) {
p[i++] = originString[j];
}
}
for (j = 0; j < exponent - precision + 1; j++) {
p[i++] = '0';
}
p[i] = '\0';
}
else {
i = 0;
k = 0;
if (p_sign == '-') {
p[i++] = '-';
}
for (j = 0; toupper(originString[j]) != 'E'; j++) {
if (isdigit(originString[j])&&k!=(1+exponent)) {
p[i++] = originString[j];
k++;
}
else if (k == (1 + exponent)) {
p[i++] = '.';
k++;
j--;
}
}
p[i] = '\0';
}
}
printf("%s", p);
}