1024. 科学计数法 (20)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
HOU, Qiming
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
#include<stdio.h>
#include<string.h>
#define size 20050
#define begin 10020
int main(void)
{
char str[size];
memset(str, 0, sizeof(str));
scanf("%s", str + begin);
//printf("该字符串为%s\n", str + begin);
if (str[begin] == '-')
{
printf("-");
}
str[begin] = '\0';
//printf("\n");
int E;
for (int i = begin; i < size; i++)
{
if (str[i] == 'E')
{
E = i;
break;
}
}
//printf("str[E]=%c\n", str[E]);
str[E] = '\0';
int end;
int i = E+1;
while (str[i] != '\0')
{
i++;
}
i--;
end = i;
int top = 0;
for (int i = end, k = 1; str[i] != '-' && str[i] != '+'; i--, k *= 10)
{
top += (str[i] - '0')*k;
str[i] = '\0';
}
//printf("top=%d\n", top);
int ch = E + 1;
//printf("str[ch]=%c\n", str[ch]);
int point ;
for (int i = begin; i < size; i++)
{
if (str[i] == '.')
{
point = i;
break;
}
}
//printf("str[point]=%c\n", str[point]);
if (str[ch] == '+')
{
str[ch] = '\0';
int i = 1;
do
{
if (str[point + 1] != '\0')
{
str[point] = str[point + 1];
str[point + 1] = '.';
}
else
{
str[point] = '0';
str[point + 1] = '.';
}
point++;
i++;
} while (i <= top);
if (str[point + 1] == '\0')
{
str[point] = '\0';
}
}
else //str[ch]=='-'
{
str[ch] = '\0';
int i = 1;
do
{
if (i == 1)
{
str[point] = str[point - 1];
str[point - 1] = '.';
}
else
{
str[point] = '0';
str[point - 1] = '.';
}
point--;
i++;
} while (i <= top);
str[point - 1] = '0';
}
for (int i = 0; i < size; i++)
{
if (str[i] != '\0')
{
putchar(str[i]);
}
}
printf("\n");
return 0;
}
该博客介绍如何将科学计数法表示的数字转换为普通数字形式,确保所有有效位得到保留,包括末尾的0。示例中给出了一个-1.2E+10的转换案例。

5588

被折叠的 条评论
为什么被折叠?



