http://codeforces.com/problemset/problem/697/B
题意:
将科学计数法表示的数字转化为一般数字(有看不懂题意的童鞋也是无语了)
思路:
直接模拟吧,模拟了一个钟,结果卡在特殊数据上,代码反复修改,自认为可以了之后又卡了一组数组
Input
1.0e0
Output
1.0
Answer
1
这内心简直是无奈的,最后乖乖的去官网找题解,也学到了新的知识,
printf("%d%.*s.%s\n",a,b,d,d+b);
scanf("%[^e]%ne%d",d,&l,&b);
不懂得看这个博客 ----->
点击打开链接
AC Code:
#include<stdio.h>
#include<cstring>
const int MYDD=1103;
int main() {
int a,k,b;
char d[MYDD];
scanf("%d.",&a); //两个scanf不可合为一个
scanf("%[^e]%ne%d",d,&k,&b);
//note: "%[^e]" 读入任意多的字符,直到遇到 "=" 停止
if(k==1&&d[0]==48&&!b) printf("%d\n",a);
//note: 这里要是改为字符型判断d[0]=='0'时间复杂度增加一倍,可达到 30ms
else if(b>=k) printf("%d%s%.*d\n",a,d,b-k,0);
else printf("%d%.*s.%s\n",a,b,d,d+b);
// 参数 b 输出字符串 d 的个数
return 0;
}
#include<stdio.h>
#include<cstring>
const int MYDD=1103;
char op[MYDD];
char ans[MYDD];
int main() {
while(scanf("%s",op)!=EOF) {
int lenop=strlen(op);
int d,e;
for(int j=0; j<lenop; j++) {
if(op[j]=='.') d=j;//确定小数点
if(op[j]=='e') e=j;//确定 e
}
int sumop=0;
for(int j=0; j<e; j++) {
if(op[j]!='.')
sumop=sumop+op[j]-'0';
}
if(sumop==0) {//如下情况的处理 0.000000e4等
puts("0");
continue;
}
int sumeright=0;// 将 e 的次方字符型转化为整数型
for(int j=e+1; j<lenop; j++) {
sumeright=sumeright*10+(op[j]-'0');
}
int demiddle=e-d-1;// 小数点和 e 之间的数字个数,即小数部分
if(sumeright>=demiddle) {
int remain=sumeright-demiddle;
int k=0;
for(int j=0; j<lenop; j++) {
if(op[j]=='.') continue;
if(op[j]=='e') break;
ans[k]=op[j];
k++;
}
for(int j=0; j<remain; j++)
ans[k++]='0';
printf("%s\n",ans);
} else {
int k=0;
int j;
for(j=0; j<d+sumeright+1; j++) {
if(op[j]=='.') continue;
ans[k]=op[j];
k++;
}
ans[k++]='.';
while(op[j]!='e') {
ans[k]=op[j];
j++,k++;
}
printf("%s\n",ans);
}
}
return 0;
}
/*
Input
1.0e0
Output
1.0
Answer
1
*/