0. 윤년이란?
윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어떨어지지 않고, 달의 공전주기와 지구의 공전주기는 다르기 때문에 태양력에서는 하루(윤일), 태음태양력에서는 한 달(윤달)을 적절한 시기에 끼워서 이를 보정한다. (위키백과)
1. 윤년을 구하는 방법
지구가 태양 둘레를 한 바퀴 도는 시간이 딱 365일이 아니기 때문에 이를 보정한다. 보정하기 위해 4로 나누어떨어지는해를 윤년으로 하는데, 그러나 이것 또한 부족하여 100으로 나누어떨어지지 않고 400의 배수인 날 또한 윤년으로 한다.
2. 구현하기
년, 월, 일을 입력해 첫해부터 모든 일을 더하여 보여주는 프로그램을 구현해 보자.
#include <stdio.h>
int mdays[][12] = {
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}
};
int isleap(int year){
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
int dayofyear(int y, int m, int d){
int days = d;
int i;
for(i=1;i<m;i++){
days += mdays[isleap(y)][i-1];
}
return days;
}
int main(void){
int year, month, day;
int retry;
do{
printf("년을 입력해 주세요 : ");
scanf("%d", &year);
printf("월을 입력해 주세요 : ");
scanf("%d", &month);
printf("일을 입력해 주세요 : ");
scanf("%d", &day);
printf("총 일 : %d", dayofyear(year, month, day));
printf("다시 하시겠습니까? 1 or 0 : ");
scanf("%d", &retry);
}while(retry == 1);
return 0;
}
평년과 윤년의 최대 일을 mdays 2차원 배열에 초기화를 했다.
year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
만약 윤년을 확인하는 수식 둘 중 1개라도 참이라면 1을 return하게 된다.
mdays[isleap(y)][i-1]
1이 반환되면 두번째 행에 저장된 윤년의 일을 가리키게 된다.
책 자료구조와 함께 배우는 알고리즘 입문을 참고
'study > c언어 알고리즘' 카테고리의 다른 글
[c언어] 소수 구하기 알고리즘 최적화 (0) | 2022.04.05 |
---|
댓글