B1024 科学计数法 (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、使用 ch 来保存符号位,并将其他位使用字符串保存。
2、使用 flag 来将科学技术法进行分段,E 前的字符直接保存到 output,E 后的字符则使用整型保存为指数 exp。
3、判断此时保存的数字还需要增加或减少多少位的小数。
4、根据 n 的正负决定对 output 执行怎样的操作,如果是正的,则在 output 后增加 n 位 0,如果是负的,则改变 output 为相应的状态。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{    
	int i, j, n, flag, exp;    
	char ch, input[10000] = { 0 }, output[10000] = { 0 };    
	
	scanf("%c%s", &ch, input);    
	n = strlen(input);    
	if (ch == '-')    
	{        
		putchar(ch);    
	}    
	for (i = 0, j = 0, flag = 0, exp = 0; i < n; i++)    
	{        
		if (flag == 0 && input[i] >= '0' && input[i] <= '9')
		{
			output[j] = input[i];
			j++;
		}
		else if(flag == 1)
		{
			exp = 10 * exp + input[i] - '0';
		}
		else if (input[i] == 'E')
		{ 
			i++;
			ch = input[i];
			flag = 1;
		}   
	}   
	if (ch == '-')   //判断还需要多少位小数
	{
		n = -j - exp + 1;
	}   
	else    
	{
		n = -j + exp + 1;    
	}    
	if (n < 0)    
	{        
		n = -n;//n位小数        
		if (n < j)        
		{            
			for (i = j, j++; n != 0 && i > 1; i--)            
			{                
				output[i] = output[i - 1];                
				n--;            
			}            
			output[i] = '.';        
		}        
		else if(n >= j)        
		{            
			printf("0.");            
			while (n != j)            
			{                
				printf("0");                
				n--;            
			}        
		}    
	}    
	else    
	{        
		while (n > 0)        
		{            
			output[j++] = '0';            
			n--;        
		}    
	}
    	printf("%s\n", output);    
    	
    	system("pause");    
    	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值