PAT 1024 科学计数法 (20)(精简版代码+思路+推荐测试样例)

1024 科学计数法 (20)(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

作者: HOU, Qiming

单位: PAT联盟

时间限制: 100ms

内存限制: 64MB

代码长度限制: 16KB

PS:

注意:1、由于数字可能很大,所以不能使用double类型,只能通过字符串输出(否则后2个测试点无法通过)。

           2、补0需要同时注意:(1)、小数部分  (2)、整数部分。

           3、输出只需要按普通数字:正数无符号。

           4、正则表达式可以去学一下,用处很大。

推荐测试样例:

+0.1E-1
-0.01E+9999
-0.01E+2
-0.012E+2
#include <iostream>
#include <string>
#include<string.h>
using namespace std;
int main()
{
	//freopen("in.txt", "r", stdin);
	string a, res;
	cin >> a;
	int k = 0;
	char ch = a[0];
	int flag = 0;
	while (a[k] != 'E') {            //记录有效数字
		if (strchr("+0.-", a[k]) == NULL)
			flag = 1;
		if (isdigit(a[k]) && flag) {
			res += a[k];
		}
		k++;
	}
	int l = a.substr(a.find('.'), a.find('E')).length() - 3;   //记录小数位数
	int c = atoi(a.substr(a.find('E') + 1, a.length()).c_str());        //记录指数
	k = c - l;        
	if (k < 0) {
		while (res.length() < abs(k)) {    //小数位补0
			res = '0' + res;
		}
		res.insert(res.end() + k, '.');        //插入小数点
		if (res[0] == '.')                //若是小数之前还需补0
			res = '0' + res;
	}
	else {
		while (k--)            //整数末尾补0
			res += '0';
	}
	if (ch == '-')            //如果是负数还需补负号,切记正数不用
		res = ch + res;
	cout << res;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40946921/article/details/81123509