PAT (Basic Level) Practice 1024 科学计数法 & PAT (Advanced Level) Practice 1073 Scientific Notation

一、概述

给出一个形如+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);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值