题目:
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
题目分析:题目规定数值最长可以是9999个字节,而指数绝对值不超过9999。而题目还要求保留所有精度,因此必须用“字符串”来处理。
思路:
/*将字符串分解为几个部分:符号,整数,小数,指数符号,指数,分别存储
* if(符号’-‘) 输出 ‘-’ //输出符号
*
* if(指数是0) 直接输出整数 .小数
* else if(指数符号’+’)
* {
* ……..if(指数>小数长度)
*……………. 直接输出整数和小数
*……………. 结尾补上(指数-小数长度个‘0’)
*…….. else
*……………. if(整数不为0) 输出整数
*……………. else if(整数是0) 不输出整数
* ……………. 输出小数(在整数后的 第(指数)位 输出小数点)
* }
* else(指数符号‘-’)
* {
*…….. 输出‘0.’
*…….. 输出(指数-1)个0
*…….. 输出整数、小数字符串
* }
* */
代码如下:
#include
#define SIZE 100000
#define TEST1
int main(void)
{
char sign;//符号
char integer;//整数
char frac[SIZE];//小数
char expSign;//指数符号
int exp;//指数
char ch;
sign = getchar();
integer = getchar();
getchar();//跳过小数点
int lenth = 0;
while((ch = getchar())!='E')
{
frac[lenth++] = ch;
}
expSign = getchar();
scanf("%d",&exp);
#ifndef TEST1
printf("%c%c.%sE%c%d\n",sign,integer,frac,expSign,exp);
#endif
if(sign == '-') printf("-");
if(!exp)//先解决特殊情况
printf("%c.%s\n",integer,frac);
else if(expSign == '+')
{
if(exp>=lenth)//指数>=小数长度,这种情况不需要输出小数点,还可能在结尾补‘0’
{
printf("%c%s",integer,frac);
for(int i = 0;i < exp - lenth ;i++)
putchar('0');
putchar('\n');
}
else
{
if(integer != '0') printf("%c",integer);
for(int i = 0;iprintf("%c",frac[i]);
if(i == exp-1)
putchar('.');
}
putchar('\n');
}
}
else//expSign == '-'
{
printf("0.");
for(int i = 0; i < exp-1;i++)
putchar('0');
printf("%c%s\n",integer,frac);
}
return 0;
}
小结&&赘述:
这一类“逻辑嵌套”的题目不算难,就是“费事儿”,需要很严谨,不然很容易某些地方犯错,然后因为是逻辑错误,所以还不那么好找,比较费事。但是我认为如果遵循以下的步骤,这一类题目会稍微“容易一些”。
1.不要忘记自己在干什么! 的确,这种题目有时候容易把自己绕晕,代码敲着敲着突然忘记了自己在干嘛。。。为了提示自己,我们需要(1)在开始敲代码前尽量详细地写下思路,不要怕花时间,这个帮助很大。 (2)多写注释,提醒自己做到哪里了
2. 先处理“特殊情况”。这样做,一方面不容易忽略特殊情况,另一方面,还能帮助接下来的代码少处理一些。
3. 先框架,后细节既然是“逻辑嵌套”,那应该遵循“由大到小,层层深入”的原则(这个貌似什么时候都是对的。。。)