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
思路:
1.读取字符串,将底数单独提取出来(滤去小数点)
base[0] = str[1]; //获得小数点前的数字
for( i =3; str[i] != 'E'; i++, len_base++)
{
base[len_base] = str[i]; //注意:len_base最后比实际多1
}
2.提取指数字符,获得指数数字exp
//获得指数数字
i++;
if(str[i] == '-') flag = 1;
for(i++; str[i] != '\0'; i++)
{
exp = exp*10;
exp += str[i] - '0';
}
3.exp为正,意味着小数点右移,比较exp 与 len_base-1,判断是否还需要输出小数点,然后分情况输出
4.exp为负,意味着小数点左移,要先输出“0.”计算还需要输出的0的个数,之后输出底数base
if(flag) //如果指数为负数,向右移位
{
printf("0.");
while(--exp) printf("0");
for(int k = 0; k<len_base; k++) printf("%c",base[k] );
}
5.exp为0,不需要移位,直接输出
代码:
/**
* @tag PAT_B_1024
* @authors R11happy (xushuai100@126.com)
* @date 2016-8-23 23:52-0:52
* @version 1.0
* @Language C++
* @Ranking 435/1515
* @function null
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
int main(int argc, char const *argv[])
{
int i, len_base=1;
int index = 0;
int exp = 0;
int flag = 0; //记录指数正负
char str[10010]; //一个char 1 byte,9999byte 至少开10000
char base[10010];
gets(str);
if(str[0] == '-') printf("-");
base[0] = str[1]; //获得小数点前的数字
for( i =3; str[i] != 'E'; i++, len_base++)
{
base[len_base] = str[i]; //注意:len_base最后比实际多1
}
//获得指数数字
i++;
if(str[i] == '-') flag = 1;
for(i++; str[i] != '\0'; i++)
{
exp = exp*10;
exp += str[i] - '0';
}
//如果exp不为0, 需要进行移位
if(exp)
{
if(flag) //如果指数为负数,向右移位
{
printf("0.");
while(--exp) printf("0");
for(int k = 0; k<len_base; k++) printf("%c",base[k] );
}
else //指数为正数,向左移位
{
if(exp < len_base-1) //移位后还需要输出小数点
{
//注意index作用域,开始误写成int index = 0, 结果对输入
//-3.1415926E+4会输出-31415.31415926
for(index = 0; index<= exp; index++) printf("%c",base[index] );
printf(".");
for(; index < len_base; index++) printf("%c",base[index] );
}
else //移位后不用输出小数点
{
for(int k = 0; k < len_base; k++) printf("%c",base[k] );
for(int k = 0 ; k < exp - len_base+1; k++) printf("0");
}
}
}
//如果exp为0,不用移位,直接输出
else
{
for(int k = 1; str[k] != 'E'; k++)
printf("%c",str[k] );
}
return 0;
}
收获:
1.一个char占1byte,9999byte至少要开char [10000]
2.注意i,j,k的作用域