본문 바로가기
프로그래밍/CodeUp

CodeUp[Q_2604] : 실수를 기약 분수로 변환

by 조원일 2020. 4. 2.
728x90

1. 문제

https://codeup.kr/problem.php?id=2604

 

실수를 기약 분수로 변환

입력된 실수를 기약 분수로 변환하여 출력하는데, 분자와 분모를 공백으로 분리하여 순서대로 출력한다. 예) 1/4가 정답이라면, 1 4만 출력.

codeup.kr

[출처 : 코드업(https://codeup.kr/)]

이번 문제는 실를 기약분수로 변화하는 문제입니다.

기약분수 : 더 이상 약분할 수 없는 분수.

 

 

2. 풀이방법

STEP 1. 분자의 자리수에 맞춰 분모를 계산
분자가 소수 첫번째 자리 -> 분모 : 10
분자가 소수 두번째 자리 -> 분모 : 100
분자가 소수 세번째 자리 -> 분모 : 1000
STEP 2. 분자와 분모를 동시에 나눠줄수 있으면 나누기

 

 

3. 해답

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

int my_atoi(char* s) {
	// 문자열을 숫자로 변환
	int tmp = 0;
	for (int i = 0; i < strlen(s); i++) {
		if (s[i] == NULL) break;
		tmp *= 10;
		tmp += ((int)s[i] - 48);
	}
	return tmp;
}

int main() {
	char s[7];
	int denominator;	// 분모
	int numerator = 1;	// 분자
	int tmp;

	scanf("0.%s", s);

	denominator = my_atoi(s);
	for (int i = 0; i < strlen(s); i++) {
		numerator *= 10;
	}

	for (int i = denominator; i > 0; i--) {
		if (((denominator % i) == 0) && ((numerator % i) == 0)) {
			// 분모,분자를 동시에 나눟어줄수 있으면
			tmp = i;
			break;
		}
	}
	printf("%d %d\n", denominator / tmp, numerator / tmp);

	return 0;
}