PAT 乙等 1024 科学记数法 C语言

1024. 科学计数法 (20)


科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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


思路:

1.首先根据底数符号位输出整个数的符号,若为负号则输出‘-’,若为正不输出

2.在输入中找到E,将之后的指数截取出来

3.判断指数是正数还是负数:

     (1)若指数为负数,则根据指数大小在底数之前输出对应个数的0,输出完0后再输出底数,记得跳过底数中的小数点;若为-0。则直接输出底数

     (2)若指数为正数,若指数小于底数中小数点后的位数,若是则将小数点右移指数位,之后再输出剩余的底数。若指数大于底数中小数点后的位数,则

               在输出完底数后在输出剩余的0;若指数为+0,则直接输出底数



一、起始变量

1.num【10000】接受字符串

2.e_mark,用于记录输入字符串中E的位置,以此来区分指数和底数

3.index_flag,用于记录指数的符号位

4.index_ch,用于记录指数字符串

5.index,用于记录将index_ch转换的指数的整数形式

二、代码

#include "stdio.h"
#include "math.h"
#include "string.h"
int main()
{
	char num[10000];
	scanf("%s",num);
	int i;
	
	//若为负,直接打印符号; 
	if(num[0] == '-')
	{
		printf("-");
	}
	
	//找到E的下标,用于分割底数和指数
	int e_mark;
	for(i = 1; i < strlen(num); i++)
	{
		if(num[i] == 'E')
		{
			e_mark = i;
			break;
		}		
	}//此循环结束后,下表位于E的位置 
	
	i++;//将下标移动到指数的符号位 
	
	//记录指数符号位 
	char index_flag = num[i];
	
	//获得指数字符串 
	char index_ch[5];//指数最多有4位,增加一位存储\0 
	int j = 0;
	for(i = i + 1; i < strlen(num); i++)//初始化为i+1,即将i移动到指数的第一位数字 
	{
		index_ch[j] = num[i];
		j++;
	}
	
	//将指数字符串转换为整形指数 
	int index = 0;
	//初始指数权重,即为指数长度减一,比如指数为1234,则1权重为为10的(4-1)次方 
	int index_right = strlen(index_ch) - 1;
	for(i = 0; i < strlen(index_ch); i++)
	{
		index += (index_ch[i] - '0') * pow(10,index_right);
		index_right--;
	}//至此已经计算完指数 
	
	if(index_flag == '-')//讨论指数为-的时候 
	{
		if(index != 0)
		{
			printf("0.");//只要指数小于0,就会产生‘0.’ 
			for(i = 0; i < index - 1; i++)//因为已经输出“0.”了,故少输出一个零 
			{
				printf("0");
			} 
			for(i = 1; i < e_mark; i++)//输出num中的底数,从1开始,0位为底数的符号位,已经在刚开始输出过 
			{
				if(i == 2)//跳过科学记数法的小数点 
				{
					continue;
				}
				printf("%c",num[i]);
			}
		}
		else if(index == 0)//指数为0 
		{
			for(i = 1; i < e_mark; i++)//输出num中的内容 
			{
				printf("%c",num[i]);
			}
		}

	}
	else if(index_flag == '+')
	{
		if(index != 0)
		{
			if(index < e_mark - 3)//指数小于小数点后底数的位数 
			{
				for(i = 1; i < e_mark ; i++) 
				{
					if(i == 2)//跳过小数点 
					{
						continue;
					}
					else if(i == 2 + index)//在指数为0的位置输出小数点 
					{
						printf("%c",num[i]);
						printf("."); 
					}
					else 
					{
						printf("%c",num[i]);
					}
				
				}
			}
			else if(index == e_mark - 3) //指数等于小数点后底数位数 
			{
				for(i = 1; i < e_mark ; i++)
				{
					if(i == 2)//跳过小数点 
					{
						continue;
					}
					else 
					{
						printf("%c",num[i]);
					}
				
				}
			}
			else if(index > e_mark - 3)//指数大于小数点后底数位数 
			{
				for(i = 1; i < e_mark; i++)
				{
					if(i == 2)//跳过底数小数点 
					{
						continue;
					}
					else 
					{
						printf("%c",num[i]);
					}
				}
				//因为指数大于小数点之后的底数位数,在输出完底数后要再输出0 
				for(i = 0; i < index - (e_mark - 3); i++)
				{
					printf("0");
				}
			}
		}
		else if(index == 0)//指数为0 
		{
			for(i = 1; i < e_mark; i++)//输出num中的内容 
			{
				printf("%c",num[i]);
			}
		}
		
	}
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值