思路不是很清晰,但是通过了,很神奇!
对正指数的处理分两种情况:
1.有效数字不足时补零
2.指数补全后还存在小数的情况
版本2
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
cin>>str;
if(str[0]=='-') putchar(str[0]);
int flag = 0,num=0,tag=0,t;
for(int i=0;i<str.size();i++){
if(str[i]=='E') {
flag=1;
t = i;
if(str[i+1]=='-') tag=1;//指数为负
}
if(flag==1&&str[i]!='+'&&str[i]!='-'&&str[i]!='E'){
num=num*10+str[i]-'0';
}
}
if(tag ==1){
for(int j=0;j<num;j++){
printf("0");
if(j==0) printf(".");
}
for(int i=1;str[i]!='E';i++){
if(str[i]!='.') putchar(str[i]);
}
}
else{
int cnt=0,k;
for(k=1;k < t && cnt<=num;k++){
if(str[k]!='.') {
putchar(str[k]);
cnt++;
}
}
while(cnt<=num){
putchar('0');
cnt++;
}
flag=0;
while(k<t){
if(flag==0){
printf(".");
flag=1;
}
putchar(str[k]);
k++;
}
}
return 0;
}
版本1
解题思路:这道题我开始打算用scanf的带有特定格式输入来接收数据的,但是经过测试,这种方法行不通,不过可以接收像年月日这样的输入2018/2/5,scanf("%d/%d/%d",&year,&month,&day)。代码部分是用gets接收一行数据,它能识别换行符并结束接收。需要注意的是这种数据+1.234E+03,这个时候的末尾小数不能输出。
#include <cstdio>
#include <cstring>
const int maxn = 10005;
char str[maxn];
int main(){
gets(str);
int len = strlen(str);
if(str[0]=='-') printf("%c",str[0]);
int pos=0;
while(str[pos] != 'E'){
pos++;
}
int coef = str[1]-'0',exp = 0;
for(int i=pos+2;i<len;i++){
exp = exp*10+str[i]-'0';
}
if(str[pos+1]=='-'){
for(int i=0;i<exp;i++){
printf(i==0?"0.":"0");
}
printf("%d",coef);
for(int i=3;i<pos;i++){
printf("%c",str[i]);
}
}else{
printf("%d",coef);
for(int i=3;i<pos;i++){
printf("%c",str[i]);
if(i==exp+2&&exp!=pos-3) printf(".");
}
for(int i=pos-3;i<exp;i++){
printf("0");
}
}
printf("\n");
return 0;
}