1/1 | 1/2 | 1/3 | 1/4 | 1/5 | … |
2/1 | 2/2 | 2/3 | 2/4 | … | … |
3/1 | 3/2 | 3/3 | … | … | … |
4/1 | 4/2 | … | … | … | … |
5/1 | … | … | … | … | … |
문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.입력
첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.
출력
첫째 줄에 분수를 출력한다.
예시
1 > 1/1
2 > 1/2
9 > 3/2
14 > 2/4
표 재정렬
1/1 | 1번째(1개) | ||||
1/2 | 2/1 | 2번째(2개) | |||
3/1 | 2/2 | 1/3 | 3번째(3개) | ||
1/4 | 2/3 | 3/2 | 4/1 | 4번째(4개) | |
5/1 | 4/2 | 3/3 | 2/4 | 1/5 | 5번째(5개) |
첫 번째 조건
입력값 = k일 때
f(n) = n(n+1)/2
f(i-1) < k <= f(i)
k는 i번 째에 존재
k는 i번 째 중 (f(i-1) - k)번째에 존재
두 번째 조건
i가 홀수 | i가 짝수 | |
---|---|---|
분자 | i로 시작 -1 | 1로 시작 +1 |
분모 | 1로 시작 +1 | i로 시작 -1 |
예
입력값 = 11
f(4) < 11 <= f(5)
11은 5번 째에 존재
11은 5번 째 중 1번 째에 존대
5는 짝수
-> 분자: 5, 분모: 1
-> 답: 5/1
#include <stdio.h>
int fraction(int k) {
return (k * (k + 1) / 2);
}
int main() {
int X, i, num, num1, num2;
scanf("%d", &X);
for (i = 1; ; i++) {
if (fraction(i - 1) < X && X <= fraction(i)) {
num = X - fraction(i - 1);
break;
}
}
if (i % 2 != 0) {
num1 = i - (num - 1);
num2 = num;
} else {
num1 = num;
num2 = i - (num - 1);
}
printf("%d/%d", num1, num2);
return 0;
}
결과는 맞았습니다!!