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;
}