PAT 1024 科学计数法

题目

思路

1.判断第一个字符,'-'则输出;

2.以E为分隔符,找到'E'对应下标i;将下标为[1...i-1]部分保留在字符串n中,将[i+1...结尾]部分保留并转为数字t(标志了要移动的位数与小数点移动方向)。

3.判断t的正负,对应小数点向右或向左移动。

(1) t>0:

未输出完当前移动位数<t的绝对值时,依次输出字符串n中非小数点的字符(每一位的数字)

不再输出时,判断退出时的情况:

(1)字符串n已经输出完,但是当前移动位数<t的绝对值,说明小数点要继续右移,则要补0,输出(t的绝对值-当前移动位数)个'0',结束;

(2)当前移动位数=t的绝对值,此时需要输出一次小数点'.',然后将n剩余字符输出

(2) t<0:

小数点向左移动,因为输入的整数部分只有1位,所以左移一定会在左侧补0,因此先输出"0."

然后输出t的绝对值-1个'0'(仅当t的绝对值-1>0时),接着依次输出字符串n中非小数点的字符即可。

代码

#include<cstdio>
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
string s;
int main(){
	cin>>s;
	if(s[0]=='-') cout<<'-';
	s=s.substr(1);
	int i=0;
	while(s[i]!='E') i++;
	string n=s.substr(0,i);
	int t=stoi(s.substr(i+1));
	int cnt=0,j;
	if(t<0){
		cout<<"0.";
		while(cnt<abs(t)-1){
			cout<<"0";
			cnt++;
		}
		for(j=0; j<n.size(); j++){
			if(n[j]!='.') cout<<n[j];
		}
	}
	else{
		cout<<n[0];
		for(j=2; j<n.size()&&cnt<t; j++,cnt++){
			cout<<n[j];
		}
		if(j==n.size()){
			while(cnt<t){
				cout<<"0";
				cnt++;
			}
		}
		else{
			cout<<".";
			while(j<n.size()){
				cout<<n[j];
				j++;
			}
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值