되는대로 살자

[C언어 기출문제&풀이] Count 본문

2009~2014/C/C++

[C언어 기출문제&풀이] Count

malu 2010. 11. 8. 19:11

프로그램 명: count
제한시간: 1 초

그림과 같은 규칙을 가지는 수열이 있다.

첫 항은 1/1 , 두 번째 항은 1/2 , 세 번째 항은 2/1 , 네 번째 항은 3/1 , 다섯번 째 항은 2/2, ...

몇 번째 항에 어떤수가 오는지를 알아내는 프로그램을 작성하시오.

입력 형식

입력은 1 부터 2 * 109 까지 자연수 이다.

출력 형식

출력은 아래 출력 예의 형식으로 한다.

입출력 예

입력

14

출력

14 IS 2/4
출처:acm
풀이 : 밑의 소스코드 중 
13            if(i%2==1)
14                printf("%d IS %d/%d",n,n-sum,i+2-n+sum);
15            else printf("%d IS %d/%d",n,i+2-n+sum,n-sum);


이 부분이 제일 중요하다. 문제에서 대각선으로줄 수를 세고 이 줄마다
번호로 첫번째 줄 부터 0,1,2,3,4,...,라 한다.
sum은 첫번째 줄 부터n의 숫자가 있는 곳 까지 몇개의 숫자가 있는지
확인 한 것이므로 n-sum은 찾으려고 하는 숫자가 줄에서 몇번째에
있는 지 뜻한다.
홀수 번째 줄일 때(i%2==1)의 조건문에서 n-sum은 문제를 보면 알 수
있을 것이고 i+2-n+sum 을 설명 하겠다.
n번째 수가 속해있는 줄을 x라고 하면 이 x줄의 원소들은 모두 분모+분자=i+2를
만족 한다. (i=0부터 시작하므로 1을 더 더한다.)
여기서 n번째 수가 이 줄 안에서 몇번째 있는지 빼 주면 되므로
위와 같은 식이 된다.

짝수는 위와 같은 방법으로 하되, 순서를 바꾸도록 한다.







소스코드
01#include <stdio.h>
02  
03int main()
04{
05    unsigned long n;
06    int sum=0,i,j,k,num[2];
07    scanf("%d",&n);
08    for(i=0;i<=n;i++)
09    {
10        sum+=i;
11        if(sum+i+1>=n) 
12        {
13            if(i%2==1)
14                printf("%d IS %d/%d",n,n-sum,i+2-n+sum);
15            else printf("%d IS %d/%d",n,i+2-n+sum,n-sum);
16            break;
17        }
18    }           
19}

에고 힘들다 ㅋㅋㅋㅋ 내 예상으로는 이 문제는 다 읽고 풀이 안보고  소스코드를 봐도 이해가 잘 안 될듯 하다(그냥그렇다고요.....아님말구요....)
그러니까 풀이 꼭 보세요!!