1024. 科学计数法 (20)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
首先要看懂正则表达式,题目中的整数部分是不包括0的,所以不要想太多。我是按照指数的正负分两种情况进行讨论。负数的情况毕竟简单,正数情况是根据指数和小数点的位数差值来进行分类。如果指数很大,那么就不需要小数点,可以直接复制数字,然后补0.如果指数小于小数位数,那么就需要先计算出小数点所在的位置。前半部分直接换算为整数,可以除去多余的0(这里其实是想到整数部分为0,其实是多此一举),然后小数部分倒序存储,再正序输出。
#include<stdio.h>
using namespace std;
int main()
{
char x[20000];
scanf("%s",x);
//printf("%s",x);
int p=0;
int countE=0;
int length=0;
int i;
int number=0;
int d=1;
char number1[20000];
char result[20000];
int count=0;
int countr=0;
int pro=0;
while(x[length]!='\0') //获得长度
{
length++;
}
if(x[0]=='-') //获得该数字符号
{
printf("-");
}
while(x[p]!='E') //获得指数符号
{
p++;
}
countE=p+1;
p=1;
while(x[p]!='E') //获取数字
{
if(x[p]!='.')
{
number1[count]=x[p];
count++;
}
p++;
}
// printf("%s\n",number1);
p=1;
for(i=length-1;i>countE;i--) //获取指数
{
number=number+(x[i]-48)*d;
d=d*10;
}
if(x[countE]=='+')
{
if(number>=countE-4)
{
for(i=0;i<count;i++)
{
printf("%c",number1[i]);
}
for (i=0;i<number-countE+4;i++)
{
printf("0");
}
}
else
{
d=1;
for(i=count-1;i>=count-(countE-number-4);i--)
{
result[countr]=number1[i] ;
countr++;
}
result[countr+1]='.';
for(i=count-(countE-number-5)-2;i>=0;i--)
{
pro=pro+(number1[i]-48)*d;
d=d*10;
}
printf("%d",pro);
printf(".");
for(i=countr-1;i>=0;i--)
{
printf("%c",result[i]);
}
}
}
else
{
if(number>=1)
{
printf("0.");
for (i=0;i<number-1;i++)
{
printf("0");
}
while(x[p]!='E')
{
if(x[p]!='.')
{
printf("%c",x[p]);
}
p++;
}
}
else
{
while(x[p]!='E')
{
printf("%c",x[p]);
p++;
}
}
}
return 0;
}