PAT B1024或A1073 科学计数法 有空必须再做的

//提交了好几次,第一次是只对了一个点,回来用书提供的另外数据测试,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; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值