C++版浙大PAT乙级1024(20分)

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

3.12改进版本

#include<iostream>
#include<string>
#include<math.h>
using namespace std;

int main(){
	int flag, p, jin, zhi, dot=1;
	string str, num, sign;
	cin >> str;
	// 1. 符号
	if(str[0]=='-')
		sign = str[0];
	// 2. 数字部分
	for(p=1; str[p]!='E'; p++){
		num += str[p];
	}
	// 3. 前移or后移
	if(str[p+1]=='+'){
		jin = 1;
	}else{
		jin = -1;
	}
	str.erase(0, p+2);
	// 4. 指数
	zhi = atoi(str.c_str());
	// 开始移位
	while(zhi-- && dot >=0){
		swap(num[dot], num[dot+jin]);
		dot += jin;
		if(dot==0){// 小数点移到第一位了
			num = "0" + num;
			dot ++;
		}else if(dot==num.size()-1 && zhi>0){// 小数点移到最后一位了,还要移
			num += "0";
		}else if(dot==num.size()-1 && zhi==0){// 小数点移到最后一位了,不移了
			num.erase(dot);
		}
	}
	cout << sign << num << endl;
	return 0;
}

原版

主要照顾好两种情况,小数点向左和向右移动的情况。还有保留小数部分的零的问题。 

#include<iostream>
#include<math.h>
using namespace std;

int main(){
	string str, a, shu;
	cin >> str;
	int sign1, sign2, zhi, i=1;
	// 正负号
	if(str[0] == '-')
		cout << str[0];
	// 单独取出有效数字部分
	while(str[i]!='E')
		shu += str[i++];
	// 指数的符号
	sign2 = str[++i]=='+' ? 1 : -1;
	// 指数
	for(i=i+1; i<str.size(); i++)
		a += str[i];
	zhi = atoi(a.c_str());
	// 指数为正的情况
	for(int p=1; p<=zhi && sign2==1; p++){
		if(p>=shu.size()-1)
            shu+='0';
        // 交换位置
		shu[p] = shu[p+1];
		shu[p+1] = '.';
	}
	// 指数为负的情况
	for(int p=1; p<=zhi && sign2==-1; p++){
		shu[1]=shu[0];
		shu[0]='.';
		shu = '0' + shu;
	}
	// 输出
	for(int i=0; i<shu.size(); i++){
		if(shu[i]=='.' && i==shu.size()-1)
			continue;
		cout << shu[i];
	}
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值