PAT-乙-1024 1024 科学计数法 (20 分)

在这里插入图片描述
在这里插入图片描述

代码

#include <iostream>
#include <sstream>

using namespace std;

int stringToInt(string t) {
	stringstream ss;
	ss<<t;
	int tmp;
	ss>>tmp;
	return tmp;
}

int main(){
	
	string s;
	cin>>s;
	
	int eindex = -1;
	for(int i=0; i<s.length(); i++){
		if(s.at(i)=='E'){
			eindex = i;
			break;
		}
	}
	
	string num = s.substr(1, 1) + s.substr(3, eindex-3);	
	string exp = s.substr(eindex+1);
	int expInt = stringToInt(exp);
	
	if(s.at(0)=='-'){
		cout<<"-";
	}
	
	if(expInt==0){
		cout<<num.substr(0, 1)<<"."<<num.substr(1)<<endl;
	}
	else if(expInt<0){
		cout<<"0.";
		for(int i=expInt; i<-1; i++){
			cout<<"0";
		}
		cout<<num<<endl;
	}
	else{
		if(expInt>=num.length()-1){
			cout<<num;
			for(int i=0; i<expInt-num.length()+1; i++){
				cout<<"0";
			}
			cout<<endl;
		}
		else{
			cout<<num.substr(0, 1+expInt)<<"."<<num.substr(expInt+1)<<endl;
		}
	}
	
	return 0;
} 

注解

1、[±][1-9].[0-9]+E[±][0-9]+ 看懂这个正则表达式是成功的关键。
第一位是符号位,必须有+或-,即使是正号也不能省略。
第二位是整数位,必须有且只有一个数,范围是1-9
第三位是小数点,必须有。
相当于,前三位是固定的。当我们用string输入时,这就给s.at(i)找前三位,带来极大的方便。
后面是若干位小数位,要确定小数位的长度,关键是找出来E的位置。小数点后,E之前的都是小数位。
E之后,是指数的符号位,必须有且只有一位,+或-
最后是若干个数字,代表指数。
首先要看懂这个规则,然后根据对应位将输入分开。
2、针对指数的不同情况(0,正数,负数),分为三种情况讨论。
(1)指数为0:即x.yyyy这种情况,只有1位整数位。
(2)指数为负:即0.xyyyy这种情况,关键是找到有几个前导0。
(3)指数为正:稍复杂,又可分为两种情况:有末尾0,无末尾0。
关键是找到何时需要添加末尾0,添加多少个末尾0。
3、学到的语法:
(1)substr(@param startIndex, @param length)
(2)stringToInt,利用stringstream

结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/82938834
今日推荐