PAT-B 1024 科学计数法【模拟+字符串】

                                              PAT-B 1024 科学计数法

                  https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168 

题目

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

样例输入

+1.23400E-03

样例输出

0.00123400

分析

模拟+字符串,注释很清楚,具体看程序。

C++程序

#include<iostream>

using namespace std;

const int N=10005;

int main()
{
	char s1,s2;//s1数符,s2阶符 
	char M[N],E[N];//M[]尾数,E[]指数
	s1=getchar();//读入数符 
	int k1=0,k2=0;//分别表示M[]、E[]的元素个数
	int pos=-1;//表示小数点的位置
	char ch;
	while((ch=getchar())!='E')
	{
		if(ch=='.')
		{
			pos=k1;//小数点在第k1个数字后面
			continue; 
		}
		M[k1++]=ch;
	}
	s2=getchar();//读入阶符
	while((ch=getchar())!='\n')
	  E[k2++]=ch;
	//计算指数的值 
	int t=0;
	for(int i=0;i<k2;i++)
	  t=t*10+E[i]-'0'; 
	if(s1=='-') putchar(s1);//当数符为负的时候才输出
	int sum=pos+(s2=='+'?t:-t);//要输出的整数部分的位数 
	if(sum<=0)//位数为负,表明要前补零 
	{
		int temp=-sum;
		//位数不够,补零 
		printf("0.");
		for(int i=0;i<temp;i++)
		  putchar('0');
		for(int i=0;i<k1;i++)
		  putchar(M[i]);
	}
	else if(0<sum&&sum<=k1)
	{
		for(int i=0;i<k1;i++)
		{
			if(i==sum) putchar('.');//小数点在第sum个数的后面 
			putchar(M[i]);
		}
	} 
	else//大于k1,表明要后补零 
	{
		for(int i=0;i<k1;i++)
		  putchar(M[i]);
		//补零  
		for(int i=k1;i<sum;i++)
		  putchar('0');
	}
	putchar('\n');
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/SongBai1997/article/details/87877531