PAT (Basic Level) Practice 1024 科学计数法 (20 分)(答案正确)(C语言)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:

+1.23400E-03

结尾无空行

输出样例 1:

0.00123400

结尾无空行

输入样例 2:

-1.2E+10

结尾无空行

输出样例 2:

-12000000000

正确答案:

#include<stdio.h>
#include<string.h>
int main(){
	char a[10005];
	int i=0,j=0,k,x=0,y=0,dif=0,term,len1,len2,len3;
	//i,j为控制变量 
	//len1为 第一段的长度(从+-到E,不包括这两个符号但包括小数点) 
	//len2为 E+或E-之后的长度 
	//len3为 小数部分的位数 
	//+1.23400E-03 
	//dif为指数的绝对值 
	//指数可以为三位数 或更高位数 
	scanf("%s",a);
	if(a[0] == '-')
	{
		x = 1;
	}
	do
	{
		i++;
	}while(a[i] != 'E');
	do
	{
		j++;
	}while(a[j]!='.');
	len1 = i - 1;
	len2 = strlen(a) - len1 - 3;
	len3 = i-j-1;
	//printf("len1=%d len2=%d i=%d\n",len1,len2,i); 
	i++;
	if(a[i] == '-')
	{
		y = 1;
	}
	for(i++;i<strlen(a);i++)
	{	
		term = (int)(a[i]-'0');
		for(k = 0;k < strlen(a)-i-1;k++)
		{
			term*=10;
		}
		dif += term;
	}
	//printf("len1=%d len2=%d len3=%d\n",len1,len2,len3);
	//printf(" dif=%d\n",dif);
	if(x)printf("-");
	if(y){
		printf("0.");
		for(i=0;i<dif-1;i++)
		{
			printf("0");
		}
		for(i=1;a[i]!='E';i++)
		{
			if(i!=2)
			{
				printf("%c",a[i]);
			}
		}
	}else if(dif < len3){
		for(i=1;a[i]!='E';i++){
			if(i!=2)
			{
				printf("%c",a[i]);
			}
			if(i==dif+2)
			{
				printf(".");
			}
		}
	}else{
		for(i=1;a[i]!='E';i++){
			if(i!=2)printf("%c",a[i]);
		}
		for(i=1;i<dif-len1+3;i++){
			printf("0");
		}
	}
		return 0;
}

部分正确(5、6测试点错误):

#include<stdio.h>
#include<string.h>
int main(){
	while(1){
	char a[10005];
	int i=0,j=0,k,x=0,y=0,dif=0,term,len1,len2,len3;
	//i,j为控制变量 
	//len1为 第一段的长度(从+-到E,不包括这两个符号但包括小数点) 
	//len2为 E+或E-之后的长度 
	//+1.23400E-03 
	//dif为指数的绝对值 
	scanf("%s",a);
	if(a[0] == '-')
	{
		x = 1;
	}
	do
	{
		i++;
	}while(a[i] != 'E');
	do
	{
		j++;
	}while(a[j]!='.');
	len1 = i - 1;
	len2 = strlen(a) - len1 - 3;
	len3 = i-j-1;
	//printf("len1=%d len2=%d i=%d\n",len1,len2,i); 
	i++;
	if(a[i] == '-')
	{
		y = 1;
	}
	for(++i;i<strlen(a);i++)
	{
		if(strlen(a)-i-1 == 0)
		{
			term = (int)(a[i]-'0');
		}else
		{
			for(k = 0;k < strlen(a)-i-1;k++)
			{
				term=(int)(a[i]-'0')*10;
			}
		}
		dif += term;
	}
	//printf("len1=%d len2=%d len3=%d\n",len1,len2,len3);
	//printf(" dif=%d\n",dif);
	if(x)printf("-");
	if(y){
		printf("0.");
		for(i=0;i<dif-1;i++)
		{
			printf("0");
		}
		for(i=1;a[i]!='E';i++)
		{
			if(i!=2)
			{
				printf("%c",a[i]);
			}
		}
	}else if(dif < len3){
		for(i=1;a[i]!='E';i++){
			if(i!=2)
			{
				printf("%c",a[i]);
			}
			if(i==dif+2)
			{
				printf(".");
			}
		}
	}else{
		for(i=1;a[i]!='E';i++){
			if(i!=2)printf("%c",a[i]);
		}
		for(i=1;i<dif-len1+3;i++){
			printf("0");
		}
	}

	}
		return 0;
}

测试点5 6无法通过

错误原因是计算指数(dif)时,如果指数为三位或者更高位数,会出错(程序逻辑错误)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值