//提交了好几次,第一次是只对了一个点,回来用书提供的另外数据测试,4个错了3,发现了很多问题。第二次又有一个点是段错误,仔细看发现数组大小1010,应该10010
//这一题要注意数符号直接判断后输出,下面就不用考虑了。
//注意0的情况先说完比较好
//想清楚第一个数不一定都是1。科学计数法小数点前有可能是1-9任何数
//这一题可以全部输出,循环语句中写下如果是'.'则break,这样就省得计算从多少个开始了
//指数为正,向右移的情况都是我自己写的,没看书,通过测试了。鼓励一下,但是书上的方法更清晰简洁
//这一题先把小数位左边输出时非常不好的!
//书另外提供的测试数据,4个错了3。总结:认真读题;思考时要验证
#include<stdio.h>
#include<string.h>
//#define LOCAL
char str[10010];//一开始写成了1010,其实人家数据是小于9999,对你无语!
int main(){
#ifdef LOCAL
freopen("B1024data.in","r",stdin);
freopen("B1024data.out","w",stdout);
#endif
gets(str);
int len=strlen(str);
int fx=1;//小数符号默认为0
int fz=1;//指数符号默认为1
int ansz=0;
//int pos=index();
int pos=0;
while(str[pos]!='E'){
pos++;
}
if(str[0]=='-')
//这里注意了,由于负数输出,正数不输出符号,因此这里判断了是负号后直接输出符号,下面就可以直接输数字不考虑符号了
{
fx=-1;
printf("-");
}
if(str[pos+1]=='-') fz=-1;
//求指数,这里也是自己就想到的
for(int i=pos+2;i<len;i++){
ansz=ansz*10+(str[i]-'0');
}
//特判指数为0的情况,参考了书上的。不然不太好弄
if(ansz==0){
//printf("");
for(int i=0;i<pos;i++){
printf("%c",str[i]);
}
}
else if(fz==-1){//一定不是0,一定会移动
printf("0.");
for(int i=0;i<ansz-1;i++){//for(int i=0;i<ansz;i++),想一下,比如是-3,对于+3.1415,应该是左边先写0.然后添加两个0,然后输str[1]
printf("0");
}
printf("%c",str[1]);
for(int i=3;i<pos;i++){
printf("%c",str[i]);
}
}
else{
//如果指数>0,小数点向右移
//需要计算小数点后面到E多少位吧
int sx=pos-3;
if(ansz>=sx){
printf("%c",str[1]);//一开始写成这个,说到底还是题目没看清printf("1");
for(int i=3;i<pos;i++){
printf("%c",str[i]);
}
for(int i=0;i<ansz-sx;i++){
printf("0");
}
}
else{
//如果不需要在末尾添0,只是转移小数点
printf("%c",str[1]);//printf("1");
for(int i=3;i<ansz+3;i++){
printf("%c",str[i]);
}
printf(".");
for(int i=ansz+3;i<pos;i++){
printf("%c",str[i]);
}
}
}
return 0;
}
PAT B1024或A1073 科学计数法 有空必须再做的
最新推荐文章于 2021-04-19 21:42:33 发布