c·c++/c 프로그래밍

년,월,일이 주어졌을 때의 총날자수 구하기

바로이순간 2013. 10. 2. 15:16

int allDays(int year, int month, int day) {

    int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int i, leap, y, total; 


    // 지금 년도 이전의 년도까지의 날자수를 구하기 위해서 y=year-1; 이라고 둔다.

    y=year-1;

    // 1년은 365.24.... 일로서

    // 그 동안 있었던 윤년의 갯수를 구해주어서 그 날자를 y*365에 더해준다.


    // 윤년의 갯수는 y/4 4년마다 한번씩 윤년이 있기 때문에

    // -y/100 100으로 나누어 떨어지는 해는 윤년이 아니다.

    // +y/400 하지만 400으로 나누어 떨어지는 해는 윤년이다.


    // 예를 들어서 year=2013일 때 y는 2012 이고

    // +y/4-y/100+y/400을 해주면 정수의 몫이기 때문에

    // +503-20+5 가 되겠다.


    // 4년마다 무조건 윤년이 있다고 보면503번이 있었다.

    // 하지만 100,200,300,400,500,....1900,2000 년에는 윤년이 없었다고 보면 -20을 해주어야 한다.

    // 또 400,800,1200,1600,2000 년은 윤년이므로 +5를 해주어야 한다.


    // 그렇게 해서 아래의 total 식이 나오게 된다. 

    total=y*365+y/4-y/100+y/400;


    // 논리식으로 참은 1로 계산이 되고, 거짓은 0으로 계산이 된다.

    // year%4==0 은 year가 윤년이면 1이고 윤년이 아니면 0이다.


    // 마찬가지로 year%100==0 의 값은 year가 100으로 나누어 떨어지면 1이고 아니면 0이다.

    // 또 year%400==0 의 값은 year가 400으로 나누어 떨어지면 1이고 아니면 0이다.


    // 따라서 leap=((year%4==0)&&(year%100!=0))||(year%4300==0); 로 계산한 결과와


    // 아래의 결과는 같다. 2012년의 경우 year%4==0는 참이기 때문에 1이 된다.

    // year%100==0는 참이 아니기 때문에 0이고

    // year%400==0도 참이 아니기 때문에 0이다.

    // 따라서 leap의 값은 1이 된다.


    // 1900을 year에 넣으면 leap의 값은 0이 나오고,

    // 2000을 year에 넣으면 leap의 값은 1이 나온다.


    // 따라서 leap=(year%4==0)-(year%100==0)+(year%400==0); 의 값은

    // year가 윤년이면 1이고, 평년이면 0이 된다.

    leap=(year%4==0)-(year%100==0)+(year%400==0);


    // 윤년,평년의 값을 2월에 더해준다.

    days[2]+=leap;


    // 지금 달 이전의 달 까지의 날자를 더해준다.

    for(i=0;i<month;i+=1) {

        total+=days[i];

    }

    // 이번 달의 날자를 더해준다.

    total+=day;

    return total;

}

'c·c++ > c 프로그래밍' 카테고리의 다른 글

C언어 기초공부-중학생의 질문  (0) 2013.10.05
_mainCRTStartUp 외부기호 확인할 수 없슴.  (0) 2013.10.04
3x3 행렬의 곱셈  (0) 2013.10.02
가우스 소거법  (0) 2013.09.26
strlen, strcpy, strcmp 구현  (0) 2013.09.24