题目描述
编写一个程序,将一个字符串中(没有空格)用科学计数法表示的数串转换成对应的实数,结果保留 6 位小数。
输入仅一个字符串,该字符串中仅有一个用科学计数法表示的数据串。
输入
一个字符串中(字符中不含空格)包含一个用科学计数法表示的数串。
输出
科学计数法表示的数串对应的实数。
样例输入
abc1.32e+2defg
样例输出
132.000000
我的思路:找到起始位置,e的位置,终止位置,然后传入qs函数,在qs函数内将这个值计算出来(用字符串来表达最后的值,避免在常规运算过程中影响精度),最后输出该字符串
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void qs(int st, int ei, int ed, char s[]) {
int j = st, bl = 0, d = 0, x = 0;
char s1[1005] = {'\0'};//用字符串,double会影响精度
double xq = 0, xh = 0;
while (j < ei) {//把数字存储到字符串里
if (s[j] == '.') {
d = x;
j++;
continue;
}
s1[x++] = s[j];
j++;
}
j++;
while (j < ed) { //求幂
if (isdigit(s[j])) {
bl = bl * 10 + (s[j] - '0');
}
j++;
}
d += bl;
int len = strlen(s1);
for (int i = d; i < d + 6; i++) {
if (isdigit(s1[i]))
continue;
s1[i] = '0';
len++;
}
for (int i = 0; i < len; i++) {
if (d == i)
printf(".");
printf("%c", s1[i]);
}
}
int main() {
char s[1005] = {'\0'};
gets(s);
int st = 0, ei = 0, ed = 0, i = 0, jflag, j1; //起始 e的位置 终止,i,是否符合条件的bool
while (i < strlen(s)) {
if (isdigit(s[i])) {
st = i;
int flag = 0;
jflag = 1;
for (int j = i; j < strlen(s); j++) { //判断是否符合条件
if (flag == 2) {//不符合条件
jflag = 0;
break;
}
if (s[j] == '.') {
flag += 1;
continue;
}
if (isdigit(s[j]))
continue;
if (s[j] == 'e') {
ei = j;
for ( j1 = j + 1; j1 < strlen(s); j1++) {
if (isdigit(s[j1]) || s[j1] == '+')
continue;
else
break;
}
break;
}
}
if (jflag) {
ed = j1;
qs(st, ei, ed, s);
break;
}
}
i++;
}
}