科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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>
int main()
{
char ch[50000] = {};
scanf("%s",ch);
int count = 0;
int len =strlen(ch);
int move = 0; //需移动
int mark1 = 0;
for(int i = len-1 ; i >= 0; i--) //计算E后面的位数
{
if('+' == ch[i])
mark1 = 1;
if('-' != ch[i] && '+' != ch[i])
{
count++;
if(1 == count)
move += ch[i] - '0';
else
{
int n = 1;
for(int j = 1 ; j < count ; j++)
{
n *= 10;
}
move += (ch[i]-'0') * n;
}
}
else
break;
}
char ch1[50000] = {}; //不带小数点
char ch2[50000] = {}; //带小数点
int n1 = 0,n2 = 0;
for(int i = 1; i < len ; i++) //提取值
{
ch2[n2++] = ch[i];
if('.' != ch[i])
{
if('E' == ch[i])
{
ch2[n2-1] = '\0';
ch1[n1] = '\0';
break;
}
else
ch1[n1++] = ch[i];
}
}
int zero = 0; //为0时直接输出0
for(int i = 0 ; '\0' != ch1[i] ; i++)
{
if('0' != ch1[i])
zero++;
}
if(0 == zero)
{
printf("0\n");
return 0;
}
if('-' == ch[0])
printf("-");
char resu[50000] = {};
if(0 == move) //当指数为0
{
printf("%s",ch2);
return 0;
}
else if(mark1) //当指数为正
{
int l = strlen(ch1) - 1;
if(move >= l)
{
int n = l+1;
strcpy(resu,ch1);
for(int i = 0 ; i < move - l ; i++)
{
resu[n++] = '0';
}
resu[n] = '\0';
}
else
{
for(int i = 0 ; move > 0 ; i++)
{
char temp = 0;
if('.' == ch2[i])
{
temp = ch2[i];
ch2[i] = ch2[i+1];
ch2[i+1] = temp;
move--;
}
}
strcpy(resu,ch2);
}
int n = 0;
for(int i = 0 ; '\0' != resu[i] ; i++)
{
if('0' == resu[i])
{
if('.' == resu[i+1] || '0' != resu[i])
break;
else
n++;
}
else
break;
}
for(int i = n ; '\0' != resu[i] ; i++)
printf("%c",resu[i]);
}
else //当指数为负
{
int n = 2;
resu[0] = '0';
resu[1] = '.';
for(int i = 1 ; i < move ; i++)
{
resu[n++] = '0';
}
for(int i = 0 ; '\0' != ch1[i];i++)
{
resu[n++] = ch1[i];
}
resu[n] = '\0';
printf("%s",resu);
return 0;
}
return 0;
}