【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)
还没有任何评论哟~
