Advertisement

【PAT B1024】科学计数法(C语言)

阅读量:

这位高人的代码非常精妙,
须注意以下几点:
一、要保留所有有效数字;
二、对于正数的情况,则无需添加符号。

在这里插入图片描述
复制代码
    #include <stdio.h>
    #define	MAX_A	 10000	
    char A[MAX_A];
    int pos_E;					/* E的位置,也是数字A除了指数部分外的末尾 */
    int e;						/* 指数exponent */
    char flag_E;				/* 指数的正负 */					
    int read_A();
    int read_cal_E();
    int print_A();
    int point_forward();		/* 小数点前移 */
    int point_back();			/* 小数点后移 */
    int print_m_n(int m, int n);
    int print_0(int x);
    /*************** 这个函数是读指数部分之前的部分 **************************/
    /*************** 注意:小数点在数组A的第三个位置 **************************/
    int read_A(){
    	int c;
    
    	for(pos_E = 0; (c = getchar()) != 'E'; ++pos_E)
    		A[pos_E] = c;
    	read_cal_E();			/* 读取指数部分并计算 */
    }
    /********************************* 读入指数 ******************************/
    int read_cal_E(){
    	int i, j;
    	int c = 0;
    	int exp[4] = {0};					/* 指数绝对值不超过四位 */
    	
    
    	flag_E = getchar(); 
    	for(i = 0; (c = getchar()) != '\n'; ++i)
    		exp[i] = c - '0';
    	for(--i, j = 1; i >= 0; --i,j *= 10)
    		e += j*exp[i];
    	return 0;
    }
    /****************************** 输出A *************************************/
    int print_A(){
    	if(A[0] == '-')
    		putchar(A[0]);
    	if(flag_E == '-')		/* 原小数点可能要前移  */
    		point_forward();
    	else					/* 原小数点可能要后移 */
    		point_back();
    	return 0;
    }
    /***************************** 小数点可能前移 ************************************/
    int point_forward(){
    	if(e > 0 ){				/* 确实要前移 */
    		printf("0.");
    		print_0(--e);		/* 输出e--个零 */
    		printf("%c", A[1]);	/* 再输出最后一个前移名额 */
    		print_m_n(3, pos_E);/* 输出其余的数 */
    	}else					/* e==0 输出 */
    		print_m_n(1, pos_E);
    	return 0;
    }
    /***************************** 小数点可能后移 ************************************/
    int point_back(){
    	int i;
    
    	if(e == 0)
    		print_m_n(1, pos_E);
    	else if(e > 0 && e < (pos_E - 3)){/* 小数点确实要后移 */
    		printf("%c", A[1]);	/* 它说保留所有有效位数字 */
    		print_m_n(3, 3+e);
    		printf(".");
    		print_m_n(3+e, pos_E);
    	}else if(e >= (pos_E - 3)){/* 没有小数点输出 */
    		printf("%c", A[1]);
    		print_m_n(3, pos_E);
    		print_0(e - (pos_E - 3));
    	}
    }
    /************************** 输出A的下标从m到n的数 *******************************/
    int print_m_n(int m, int n){
    	for(; m < n; ++m)
    		printf("%c", A[m]);
    	return 0;
    }
    /******************************* 输出x个零 *************************************/
    int print_0(int x){
    	for(; x > 0; --x)
    		printf("0");
    	return 0;
    }
    int main(){
    	read_A();			/* 先将A的信息读进来 */
    	print_A();			/* 输出A */
    	return 0;
    }

全部评论 (0)

还没有任何评论哟~