과학 계수 법

3242 단어 PAT
과학 계수 법 은 과학자 들 이 크 거나 작은 숫자 를 나타 내 는 편리 한 방법 으로 정규 표현 식 [+ -] [1 - 9] 을 만족 시 키 는 것 이다.
현재 과학 계수 법의 형식 으로 실수 A 를 드 립 니 다. 프로그램 을 작성 하여 일반 숫자 표시 법 에 따라 A 를 출력 하고 모든 유효 위 치 를 유지 하도록 하 십시오.
입력 형식:
각 입력 에는 과학 계수 법 으로 표 시 된 실수 A 를 포함 하 는 테스트 용례 가 1 개 씩 포함 되 어 있다.이 숫자의 저장 길 이 는 9999 바이트 를 초과 하지 않 고 지수의 절대 치 는 9999 를 초과 하지 않 는 다.
출력 형식:
모든 테스트 용례 에 대해 한 줄 에서 일반 숫자 표시 법 에 따라 A 를 출력 하고 모든 유효 위 치 를 유지 하 며 끝의 0 을 포함 합 니 다.
입력 샘플 1:
+1.23400E-03

출력 예시 1:
0.00123400

입력 샘플 2:
-1.2E+10

출력 예시 2:
-12000000000
알고리즘:
  • 알고리즘 시작.
  • 문자열 을 읽 습 니 다.
  • 스 캔 유효 자릿수 와 지수
  • 소수점 위 치 를 확인한다.
  • 충분 한 공간 을 분배 하고 일반 숫자 표현법 이 표시 하 는 숫자 를 쓴다.
  • 출력 숫자.
  • 알고리즘 이 끝 났 습 니 다.

  • 다음 코드 는 VS 2015 에서 성공 적 으로 실행 되 며, scanf 를 수정 할 수 있 습 니 다.s 는 PAT 에서 실행 할 수 있 습 니 다.
    #include
    #include
    #include
    #include
    #define MAX 10000
    int main(void) {
    	char originString[MAX];
    	int i, j, k, precision = 0, exponent = 0;
    	char p_sign, e_sign;
    	char* p;
    	scanf_s("%s", originString, MAX);
    	for (i = 0; toupper(originString[i]) != 'E'; i++) {
    		if (i == 0) {
    			p_sign = originString[i];
    		}
    		else if (isdigit(originString[i])) {
    			precision++;
    		}
    	}
    	while (i < (signed)strlen(originString)) {
    		if (originString[i] == '+' || originString[i] == '-') {
    			e_sign = originString[i];
    		}
    		else if (isdigit(originString[i])) {
    			exponent = exponent * 10 + originString[i] - '0';
    		}
    		i++;
    	}
    	p = (char*)malloc(sizeof(char)*(precision + exponent + 3));
    	if (e_sign == '-') {
    		if (exponent == 0) {
    			i = 0;
    			j = 0;
    			if (p_sign == '-') {
    				p[i++] = '-';
    			}
    			for (; toupper(originString[j]) != 'E'; j++) {
    				if (isdigit(originString[j]) || originString[j] == '.') {
    					p[i++] = originString[j];
    				}
    			}
    			p[i] = '\0';
    		}
    		else {
    			i = 0;
    			if (p_sign == '-') {
    				p[i++] = '-';
    			}
    			p[i++] = '0';
    			p[i++] = '.';
    			for (j = 0; j < exponent - 1; j++) {
    				p[i++] = '0';
    			}
    			for (j = 1; toupper(originString[j]) != 'E'; j++) {
    				if (originString[j] != '.') {
    					p[i++] = originString[j];
    				}
    			}
    			p[i] = '\0';
    		}
    	}
    	else {
    		if (precision - 1 <= exponent) {
    			i = 0;
    			if (p_sign == '-') {
    				p[i++] = '-';
    			}
    			for (j = 0; toupper(originString[j]) != 'E'; j++) {
    				if (isdigit(originString[j])) {
    					p[i++] = originString[j];
    				}
    			}
    			for (j = 0; j < exponent - precision + 1; j++) {
    				p[i++] = '0';
    			}
    			p[i] = '\0';
    		}
    		else {
    			i = 0;
    			k = 0;
    			if (p_sign == '-') {
    				p[i++] = '-';
    			}
    			for (j = 0; toupper(originString[j]) != 'E'; j++) {
    				if (isdigit(originString[j])&&k!=(1+exponent)) {
    					p[i++] = originString[j];
    					k++;
    				}
    				else if (k == (1 + exponent)) {
    					p[i++] = '.';
    					k++;
    					j--;
    				}
    			}
    			p[i] = '\0';
    		}
    	}
    	printf("%s", p);
    }

    좋은 웹페이지 즐겨찾기