1024 科学计数法,C

这题挺麻烦的,各种小数点和正负号搞的乱死,看的时候要看仔细了,我特意用1.1~2.3标出了6种情况,实际上只分了3种,前3种情况理解了,后面的就是对应地方都-1的问题

#include <stdio.h>
#include <math.h>
int main()
{
	char a[20000] = {0};	//输入
	char b[20000] = {0};	//输出
	int d=0,i=2,x=0,n=0,j=0;

	scanf("%s",a);
	//printf("%s\n",a);		检验是否正确接收字符串
	while( a[n]!='E')	n++;	//结束后,a[n]=='E'
	while( a[n+x] )		x++;	x = x-2;	//结束后,指数部分有x位数
	while(x)	{d += (a[n+i]-'0')* pow(10,x-1);	i++;	x--;}
	if(a[n+1] == '-')	d = d * (-1);	//d是小数点要左或右移动多少位
	
	//printf("%d\n",d);		检验指数部分d是否正确
	i=0;
	if( a[0]==45 )	//1.负数,负数与正数只有第一个符号有无的区别,内容相似
	{	b[0] = a[0];
		if( d>0 )			//1.1	- +情况
		{
			b[1] = a[1];
			while( d && a[3+i] != 69 )	//69是字母'E'
			{
				b[2+i] = a[3+i];	
				i++;
				d--;
			}
			if( a[3+i] != 69 )	//要加'.'
			{
				b[2+i] = '.';	i++;
				while(a[2+i] != 69)	{b[2+i] = a[2+i];	i++;}
			}
			while( d )	//要补'0'
			{
				b[2+i] = '0';
				i++;
				d--;
			}
		}
		else if(d==0)		//1.2	- 0情况
			while(a[i] != 69)	{b[i] = a[i]; i++;}
		else				//1.3	- -情况
		{
			b[1] = '0'; b[2] = '.';	d++;
			while( d!=0 )	
			{
				b[3+i] = '0';
				d++;
				i++;
			}
			b[3+i] = a[1];	i++;
			while( a[3+j] != 69 )
			{
				b[3+i] = a[3+j];
				i++;
				j++;
			}
		}
	}

	else		//2.正数
	{
		if( d>0 )			//2.1	+ +情况
		{
			b[0] = a[1];
			while( d && a[3+i] != 69 )
			{
				b[1+i] = a[3+i];	
				i++;
				d--;
			}
			if( a[3+i] != 69 )	
			{
				b[1+i] = '.';	i++;
				while(a[2+i] != 69)	{b[1+i] = a[2+i];	i++;}
			}
			while( d )
			{
				b[1+i] = '0';
				i++;
				d--;
			}
		}
		else if(d==0)		//2.2	+ 0情况
			while(a[i+1] != 69)	{b[i] = a[i+1]; i++;}
		else				//2.3	+ -情况
		{
			b[0] = '0'; b[1] = '.';	d++;
			while( d!=0 )	
			{
				b[2+i] = '0';
				d++;
				i++;
			}
			b[2+i] = a[1];	i++;
			while( a[3+j] != 69 )
			{
				b[2+i] = a[3+j];
				i++;
				j++;
			}
		}
	}
	printf("%s\n",b);
	
	return 0;
}
1024 科学计数法,C1024 科学计数法,C 3大道至简,戒躁3 发布了24 篇原创文章 · 获赞 0 · 访问量 309 私信 关注
上一篇:leetcode——69.x的平方根


下一篇:为什么hadoop中用到的序列化不是java的serilaziable接口去序列化而是使用Writable序列化框架