ZJGSU 2477 字符串中科学计数法传实数(仅校内oj通过,佬们可以留一下自己的思路嘛,让我学一下())

题目描述

编写一个程序,将一个字符串中(没有空格)用科学计数法表示的数串转换成对应的实数,结果保留 6 位小数。

输入仅一个字符串,该字符串中仅有一个用科学计数法表示的数据串。

输入

一个字符串中(字符中不含空格)包含一个用科学计数法表示的数串。

输出

科学计数法表示的数串对应的实数。

样例输入

abc1.32e+2defg

样例输出

132.000000

我的思路:找到起始位置,e的位置,终止位置,然后传入qs函数,在qs函数内将这个值计算出来(用字符串来表达最后的值,避免在常规运算过程中影响精度),最后输出该字符串

#include 
#include 
#include 

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++;
	}
}

你可能感兴趣的:(校园oj,c语言)