1.题目描述
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
2.解题思路:
可以将输入表达式以E为分界分为两个部分存储。(也可以以‘E'、’.' 分为三个部分,开心就好)将指数部分转化为数字,根据其正负号判断是在数字前添0还是将小数点向后移。需要注意的是输出时只有负数才需要输出符号,正数不需要。
3.代码部分:
#include<stdio.h>
#include<string.h>
int change_num(char *e);
int main(void)
{
char a[100005]={0},e[100]={0};
int i=0,eval=0;
char ch=0;
while((ch=getchar())!='E') //数字部分存在a数组中
a[i++]=ch;
i=0;
while((ch=getchar())!='\n') //指数部分存在e数组中
e[i++]=ch;
eval=change_num(e); //将指数转化为数字
if(e[0]=='-') //指数为负,在小数点后面添eval-1个0,其实这里没有考虑指数为-0的情况
{
if(a[0]=='-') //若a[0]=='+',则不输出符号
printf("-");
printf("0.");
for(i=1;i<eval;i++)
printf("0");
printf("%c%s",a[1],&a[3]); //将数字部分的小数点去掉输出
}
if(e[0]=='+') //指数为正分两种情况讨论
{
if(a[0]=='-')
printf("%c%c",a[0],a[1]);
else
printf("%c",a[1]);
for(i=3;i<eval+3;i++) //情况1:添加指数后没有小数部分
{
if(i<strlen(a))
printf("%c",a[i]);
else
printf("0");
}
if(eval+3<strlen(a)) //情况2: 添加指数后还有小数部分
printf(".%s",&a[eval+3]);
}
return 0;
}
int change_num(char* e)
{
int i=1,num=0;
while(e[i]!=0)
num=num*10+e[i++]-48;
return num;
}