1024 科学计数法 (20)(20 分)教你如何化繁为简

本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168

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

分析:

本题处理起来确实麻烦,但你是不需要字符串函数来处理的。首先你需要找到E的位置,从E的位置+1往后计算指数大小EX,EX就表示需要在小数部分前或后加EX个0,然后判断第1个字符是不是负号,是则输出。再判定EX即0的长度是否为0,如果为0则输出从1开始到E之前位置的字符即可,如果EX不为0,则有如下两种情况:

1.EX>0

首先输出整数部分,然后需要判定小数部分长度和EX的大小,又分两种情况:

1.1 EX<小数部分长度

输出下标从3即小数部分第1个数字的位置开始EX个长度的字符,如果用for循环输出,假设循环变量为j,EX也即0的长度为len0,则条件为j=3,j<3+len0,j++,注意,3+len0不要写成j=j+len0!否则j的上限不断变化,到时候可能会越界!然后输出小数点,再输出小数点到E之间的部分,注意循环变量的初始值为3+len0

1.2 EX>=小数部分长度

先输出从下标3开始到E的部分,假设小数部分长度为D,则输出EX-D个长度的0

2.EX<0

先输出0和小数点,再输出EX-1长度的0,再输出原整数部分即第2个字符,再输出下标从3开始到E的部分

代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	int len0=0;
	cin>>s;
	for(int i=0;i<s.length();i++)
	if(s[i]=='E')//找到E
	{
		for(int j=i+2;j<s.length();j++)
		len0=len0*10+(s[j]-'0');//计算指数即需要增加的0的长度 
		if(s[0]=='-')
		cout<<'-';
		if(len0==0)//若指数为0 
		{
			for(int j=1;j<i;j++)//输出下标从1开始到E的串 
			cout<<s[j];
		}
		else if(s[i+1]=='+')//若指数为正 
		{
			cout<<s[1];//输出整数部分 
			if(len0<i-3)//若0的长度小于小数部分长度 
			{
				for(int j=3;j<3+len0;j++)//输出下标从3开始的0的长度的部分 
				cout<<s[j];
				cout<<'.';//输出小数点 
				for(int j=3+len0;j<i;j++)//输出小数点后到E之间的部分 
				cout<<s[j];
			}
			else//若0的长度大于等于小数部分长度 
			{
				for(int j=3;j<i;j++)//输出下标从3开始到E的部分 
				cout<<s[j];
				for(int j=1;j<=len0-(i-3);j++)//输出0长度-小数部分长度的0
				cout<<0; 
			}
		}
		else//若指数为负 
		{
			cout<<"0.";//输出0和小数点 
			for(int j=1;j<len0;j++)//输出0长度-1的0
			cout<<0;
			cout<<s[1];//输出原整数部分 
			for(int j=3;j<i;j++)//输出原小数部分 
			cout<<s[j];	
		}
		return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/81736497