问题描述:
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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
AC代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define maxn 10010
int main()
{
// freopen("input.txt","r",stdin);
char s[maxn];
char tail[maxn];
char index[maxn];
char sym1,sym2;//记录尾数和指数的符号
int num;
scanf("%s",s);//得到s
int len=strlen(s),i,j;//得到字符串的长度
sym1=s[0];
tail[0]=s[1];
for(i=3;i<len;i++)
{
if(s[i]=='E')
{
break;
}
tail[i-2]=s[i];//
}
tail[i]='\0';//得到尾数部分
i++;//得到E的长度
sym2=s[i++];//得到指数部分的符号
for(j=0;(j+i)<len;j++)
{
index[j]=s[j+i];
}
index[j]='\0';
num=atoi(index);//指数的数值
int tlen=strlen(tail);
if(num==0)//指数为0,尾数原封不动
{
if(sym1=='-')printf("%c",sym1);
for(i=0;i<tlen;i++)
{
printf("%c",tail[i]);
if(i==0)printf(".");
}
}
else if(sym2=='-')//指数为负数
{
if(sym1=='-')printf("%c",sym1);
printf("0.");//得到字符串
for(int i=1;i<num;i++)//还要打印0,
{
printf("0");
}
printf("%s",tail);
}
else//指数为正数
{
if(sym1=='-')printf("%c",sym1);
if(num<tlen-1)//如果小数部分的长度(tlen-1)大于指数num,那么保留小数点
{
for(i=0;i<tlen;i++)
{
printf("%c",tail[i]);
if(num==i)printf(".");//指数为0时,小数点打印i==0时候,平移num个单位后打印小数点的位置为第num个数字后(从0开始)
}
}
else
{//不需要保留小数点
printf("%s",tail);//直接打印位数部分
for(i=0;i<num-(tlen-1);i++)
printf("0");//补末尾的0;
}
}
}