본문 바로가기
WORK/Sotfware

[윤년] 윤년 계산 및 프로그램

by KANG Stroy 2020. 4. 18.
728x90
728x90

달력을 하나 만들어 넣어야 해서, 윤년 계산을 한번 살펴 보았습니다. 

그냥 잘 만들어 놓은것을 쓰면 되지만, 프로그램을 처음 배운다는 생각으로 작성해 보았습니다. 

위키 백과 윤년

https://ko.wikipedia.org/ 에서 글을 복사해 왔습니다.
태양력의 윤년

현재 전 세계 대부분의 나라에서 쓰는 그레고리력은 4년에 반드시 하루씩 윤날(2월 29일)을 추가하는 율리우스력을 보완한 것으로, 태양년과의 편차를 줄이기 위해 율리우스력의 400년에서 3일(세 번의 윤년)을 뺐다.

그레고리력의 정확한 윤년 규칙은 다음과 같다.
- 연수가 4로 나누어 떨어지는 해는 윤년으로 한다. 
   (1988년, 1992년, 1996년, 2004년, 2008년, 2012년, 2016년, 2020년, 2024년, 2028년, 2032년, 2036년, 2040년, 2044년 ...)
- 연수가 4, 100으로 나누어 떨어지는 해는 평년으로 한다. 
  (1900년, 2100년, 2200년, 2300년, 2500년...)
- 연수가 4, 100, 400으로 나누어 떨어지는 해는 윤년으로 둔다. 
   (2000년, 2400년...)

즉, 400년에 97년은 윤년이 되며, 1년은 평균 365.2425일이 된다. 이는 춘분점을 기준으로 한 태양년보다 0.0003일(26초)이 길기 때문에, 약 3,300년마다 1일의 편차가 난다.

윤년 수정 제안과 그 한계

그레고리력은 상당히 치밀한 역법으로 1582년에 만들어진 이래 아직까지 수정된 바가 없다. 그러나, 약 3천 년마다 1일의 편차가 발생할 수 있어서 몇 가지 수정안이 제시된 바 있는데, 대표적인 것이 4,000년마다 1일씩 윤년을 추가로 빼자는 제안이다. 간혹 이 제안이 이미 받아들여졌다는 주장이 있으나 이는 사실이 아니다. (현재의 태양년과 그레고리력의 수적 차이, 율리우스력이 128년마다 1일의 편차가 난다는 것만 고려하면 3,200년마다 1일씩 윤년에서 제외하는 것이 더 타당하다.)

이러한 수정안들의 가장 큰 문제점은 수천 년 이상의 주기로 일어나는 지구의 세차운동이나 조석의 감소로 인한 하루 길이의 증가를 계산에 넣고 있지 않다는 데에 있다. 특히, 조석은 후빙기 반동이나 기후 변화로 인한 해수면 상승에 따라 꽤 변할 수 있는데, 이러한 자료는 예측하기 힘들기 때문에 이를 고려하여 역법을 만드는 데는 상당한 시일이 걸릴 것이다.그리고 2033년에는 윤년과 삭망월이 겹처져서 2033년 문제가 생긴다.

위의 내용에서 빨간색 부분만을 가져와서 간단하게 플로우를 그려 보았습니다. 

- 연수가 4로 나누어 떨어지는 해는 윤년으로 한다. 
   (1988년, 1992년, 1996년, 2004년, 2008년, 2012년, 2016년, 2020년, 2024년, 2028년, 2032년, 2036년, 2040년, 2044년 ...)

- 연수가 4, 100으로 나누어 떨어지는 해는 평년으로 한다. 

  (1900년, 2100년, 2200년, 2300년, 2500년...)

- 연수가 4, 100, 400으로 나누어 떨어지는 해는 윤년으로 둔다. 

  (2000년, 2400년...)

 

 

2000년을 테스트 한다면 
첫 번째 2000 / 4 = 500 이고 나머지가 0 
두 번째 2000 / 100 = 20 이고 나머지가 0
세 번째 2000 / 400 = 5 이고 나머지가 0 이므로 윤년이 된다. 

 

 

1900 년을 테스트 한다면
첫 번째 1900 / 4 = 475 이고 나머지가 0 
두 번째 1900 / 100 = 19 이고 나머지가 0
세 번째 1900 / 400 = 4 이고 나머지가 300(나누어 떨어지지 않으므로) 이므로 평년이 된다. 

 

 

프로그램을 만든다면? 

year는 연도 입니다. 원하는 연도를 넣어 주세요. scanf를 입력 받아서 하셔도 될거 같습니다. 

int year = 0; 
printf("input year : ");
scanf("%d", &year);
if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 )
{
     printf("_year_\r\n");
}

한줄로 나타낼 수 있을거 같내요. 

달력은 https://gangsanilee.tistory.com/2463

 

[프로그램] 달력 만들기

달력을 만들기 위한 명세서 입니다. 1. 1년을 계산 한다. 2. 윤년을 체크 하여 더한다. 3. 한달의 시작점을 찾는다. ( 1년 1월 1일은 월요일 이다. ) 4. 출력 한다. 1년을 계산 매달은 day로 배열을 만든

gangsanilee.tistory.com

 

728x90

'WORK > Sotfware' 카테고리의 다른 글

[String Compare] 스트링 비교  (0) 2020.07.31
[프로그램] 달력 만들기  (0) 2020.04.24
[자료모음] Critical Section  (0) 2019.12.14
[memory] 메모리의 종류  (0) 2018.09.20
[Linked List No1] Struct 분석  (0) 2018.09.10

댓글