A1073.Scientific Notation

题意:

就是给出一个科学计数法的字符串,要求输出表示的整数

思路分析:

首先考虑数的正负号,如果字符串第一个字符s[0]是'-',则应先输出'-',否则原样输出。之后获取指数的值,在此之前需要先取得'E'的下标index,而后从index+2向后枚举字符串,并将字符串转为10进制,即为指数exp。

1.如果s[index+1]='-'即指数为负数,说明小数点需要向左移,故而先计算前导0的个数qiandao,qiandao = exp-1。输出的方法为:先输出"0.",而后输出qiandao个数的0,之后原样输出'E'之前的系数部分,碰到'.',则不输出。

2.如果s[index+1]='+'即表示指数为正数,小数点需要右移,而需要输出的后导0的个数为exp-index+3(自己推导下),原样输出'E'之前系数部分时,当枚举变量i==exp+2时则还需输出一个'.',当然此时不需要输出后导0。

注意点

  • 指数部分有可能为+0,-0;这种情况下应该原样输出
  • 注意模拟过程中.应该放的位置。

参考代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
char s[maxn];

int main(void){
	scanf("%s",s);
	int len = strlen(s);
	int index = strchr(s,'E') - s;		//找到E的下标位置
	if(s[0] == '-') cout<<"-";
	int exp = 0;		//指数
	for(int i = index + 2;i < len;i++) {
		exp = exp*10 + s[i] - '0';
	}
	
	if(exp == 0) {			//如果指数为0,则原样输出 
		for(int i = 1;i < index;i++) cout<<s[i];
	} else {
		if(s[index+1] == '-') {			//如果指数为负数 
			int qiandao = exp - 1;		//计算需要输出的前导0
			cout<<"0.";
			for(int i = 0;i < qiandao;i++) cout<<"0";		//输出前导0 
			for(int i = 1;i < index;i++) {
				if(s[i] == '.') continue;
				cout<<s[i];
			}
		} else if(s[index+1] == '+') {
			for(int i = 1;i < index;i++) {
				if(s[i] == '.') continue;
				cout<<s[i];
				if(i == exp+2 && i != index-1) cout<<".";
			}
			if(exp > index - 3) {		//输出后导0; 
				for(int i = 0;i < exp-index+3;i++) cout<<"0";
			}
		}
	}
	return 0;
}

总结

本题细节较多,需要注意一些特殊地方的处理

posted @ 2019-01-30 18:03  Western_Trail  阅读(234)  评论(0编辑  收藏  举报