一、概述
给出一个形如+1.23400E-03的科学计数法表示的数字,输出它的十进制表示。
有三种可能性:
1、指数为负,前添零;
2、指数为正,后添零;
3、指数为负,右移小数点。
第三种情况可能会忘记,导致有一个测试点过不去。
二、分析
观察给出的数字,使用string存储。
分成五部分:
数字符号、数字整数部分、数字小数部分、指数符号、指数部分。
要从一个string中切割出五个char数组,同时要记录数字小数部分的位数。如下所示:
string num;
char basesign, base1, base2[10000] = { 0 }, expsign, exp[5];
cin >> num;
int length = num.length();
int i = 3;
int AfterPointNum = 0;
basesign = num[0];
base1 = num[1];
while (num[i] != 'E')
{
base2[i - 3] = num[i];
i++;
}
AfterPointNum = i - 3;
i++;
expsign = num[i];
i++;
int j;
for (j = 0; i < length; i++, j++)
exp[j] = num[i];
数字符号用于判断是否输出负号,因为正号不用输出。
然后我们注意到指数部分是char数组,应转换为int,如下
if (j == 1)
_exp = exp[0] - 48;
else if (j == 2)
{
if (exp[0] == '0')
_exp = exp[1] - 48;
else
_exp = (exp[0] - 48) * 10 + exp[1] - 48;
}
else if (j == 3)
_exp = (exp[0] - 48) * 100 + (exp[1] - 48) * 10 + exp[2] - 48;
else if (j == 4)
_exp = (exp[0] - 48) * 1000 + (exp[1] - 48) * 100 + (exp[2] - 48) * 10 + exp[3] - 48;
很蛋疼的一点是,别看题目中如果指数有效位数有一位它前面加个0,指数前面几个零都是可以的,比如说指数可以是+4,+04,+0004,再长测试中就没出现了,但+4和+04是有的。
那么准备工作就完成了,下面开始输出:
对于一中所说的三种可能性,先根据指数正负区分,对于指数为负,利用之前记录的数字小数部分位数和指数大小进行区分,然后分别输出即可。如下
if (expsign == '+')
{
if (_exp >= AfterPointNum)
{
printf("%c", base1);
printf("%s", base2);
int m;
for (m = 0; m < _exp - AfterPointNum; m++)
printf("0");
}
else if (_exp < AfterPointNum)
{
printf("%c", base1);
int m;
for (m = 0; m < AfterPointNum - _exp + 1; m++)
printf("%c", base2[m]);
printf(".");
for (; m < AfterPointNum; m++)
printf("%c", base2[m]);
}
}
else
{
printf("0.");
int n;
for (n = 0; n < _exp - 1; n++)
printf("0");
printf("%c", base1);
printf("%s", base2);
}
注意一点,如果想使用%s来输出一整个char数组,必须保证在初始化数组时令所有元素为{ 0 }。
三、总结
string切割后要用char数组,string切割成string不好写,比如说
string s1,s2;
cin >> s1;
s2[0]=s1[1];
这样无法得到所需的目的段。
PS:代码如下
#include<stdio.h>
#include<string>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
string num;
char basesign, base1, base2[10000] = { 0 }, expsign, exp[5];
cin >> num;
int length = num.length();
int i = 3;
int AfterPointNum = 0;
basesign = num[0];
base1 = num[1];
while (num[i] != 'E')
{
base2[i - 3] = num[i];
i++;
}
AfterPointNum = i - 3;
i++;
expsign = num[i];
i++;
int j;
for (j = 0; i < length; i++, j++)
exp[j] = num[i];
if (basesign == '-')
printf("-");
int _exp = 0;
//j--;
if (j == 1)
_exp = exp[0] - 48;
else if (j == 2)
{
if (exp[0] == '0')
_exp = exp[1] - 48;
else
_exp = (exp[0] - 48) * 10 + exp[1] - 48;
}
else if (j == 3)
_exp = (exp[0] - 48) * 100 + (exp[1] - 48) * 10 + exp[2] - 48;
else if (j == 4)
_exp = (exp[0] - 48) * 1000 + (exp[1] - 48) * 100 + (exp[2] - 48) * 10 + exp[3] - 48;
if (expsign == '+')
{
if (_exp >= AfterPointNum)
{
printf("%c", base1);
printf("%s", base2);
int m;
for (m = 0; m < _exp - AfterPointNum; m++)
printf("0");
}
else if (_exp < AfterPointNum)
{
printf("%c", base1);
int m;
for (m = 0; m < AfterPointNum - _exp + 1; m++)
printf("%c", base2[m]);
printf(".");
for (; m < AfterPointNum; m++)
printf("%c", base2[m]);
}
}
else
{
printf("0.");
int n;
for (n = 0; n < _exp - 1; n++)
printf("0");
printf("%c", base1);
printf("%s", base2);
}
}