闰年 闰年: 1.为了弥补人为的年份规定与地球实际绕日公转的时间差,2.而人为把时间差补上了的年份,该年即为闰年. 遵循的规律为: 四年一闰,百年不润,四百年再润. if((year % 400 == 0)|(year % 4 == 0)&(year % 100 != 0))//闰年的计算方法 详情如下: 闰年(leap year),在公历(格里历)或夏历中有闰日的年份,以及在中国旧历农历中有闰月的年份。地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,于第四年加于2月,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。夏历的平年只有354日,比12个朔望月短0.3671日,为使每月初一与月朔相合,规定每30年中有11年的年底增加1日,这一年的历年有355日,即为闰年。中国旧历农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。在加有闰月的那一年有13个月,历年长度为384或385日,这一年也称为闰年。 按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的就是平年。 也就是我们通常所说的: 四年一闰,百年不闰,四百年再闰。 西方公历的“闰年” 阳历中有闰日的年份叫闰年,相反就是平年,平年为365天,闰年为366天。在公历(格里历)纪年中,平年的二月为28天,闰年的二月为29天。闰年平月2月29日为闰日。 增加闰日的原因 现时的公历以回归年为“年”的计算基础,而一个回归年大约等于365.24220日。因为在平年公历只计算365日,结果四年后便会累积0.24220×4=0.9688日,大约等于一日,所以便逢四年增加一日闰日以抵销这0.9688日。 计算闰年的方法 公历纪年法中,能被4整除的大多是闰年,不能被100整除而能被400整除的年份是闰年,能被3200整除的也不是闰年,如1900年是平年,2000年是闰年,3200年不是闰年。 中国农历的“闰年” 中国旧历农历纪年中,有闰月的一年称为闰年。一般年份为12个月,354或355天,闰年则为13个月,383或384天 编程中公历闰年的简单计算方法: 设年份 year if (year能被4整除 and 不能被100整除) or year能被400整除 then 该年为闰年 else 该年为平年 具体程序代码: #主模块: ;月历打印 ;主程序设置好入口参数,BX=年份,DL=月份 ;调用子程序 display ;By wangrui ;2006-12-8 extrn display:far Esccode equ 01h Up equ 048h Down equ 050h Left equ 04bh Right equ 04dh dseg segment Year dw 0 Month db 0 temp db 10 dup(0) count dw ? ErrMsg db 0dh,0ah,"The input NOT decimal! $" dseg ends cseg segment assume cs:cseg,ds:dseg start: mov ax,dseg mov ds,ax call GetYearMonth Ws: mov bx,Year mov dl,Month call far ptr display again: mov ah,0 int 16h cmp ah,Esccode je Exit cmp ah,Up je NextY cmp ah,Down je PreY cmp ah,Left je PreM cmp ah,Right je NextM jmp again NextY: inc Year jmp Ws PreY: dec Year jmp Ws NextM: inc Month cmp Month,12 jbe skip0 mov Month,1 inc Year skip0: jmp Ws PreM: dec Month cmp Month,1 jae skip1 mov Month,12 dec Year skip1: jmp Ws Exit: mov ah,4ch int 21h ;************************************************** GetYearMonth proc near push ax push cx push si push di inputagain: mov Year,0 mov Month,0 mov si,0 repeatY: mov ah,1 int 21h cmp al,0dh je EndY cmp al,20h je EndY cmp al,1bh je ExitDos0 cmp al,30h jb Err cmp al,39h ja Err sub al,30h mov temp[si],al inc si jmp repeatY Err: mov ah,9 lea dx,ErrMsg int 21h mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h jmp inputagain EndY: mov bx,10 mov di,si mov si,0 NextYBit: mov ah,0 mov al,temp[si] mov count,di sub count,si dec count mov cx,count jcxz skipY lopmul: mul bx loop lopmul skipY: add Year,ax inc si cmp si,di jne NextYBit ;----------------------------------The year is put into [Year] push dx mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h pop dx jmp skiplap ExitDos0: jmp ExitDos skiplap: mov si,0 repeatM: mov ah,1 int 21h cmp al,0dh je EndMon cmp al,20h je EndMon cmp al,1bh je ExitDos cmp al,30h jb Err cmp al,39h ja Err sub al,30h mov temp[si],al inc si jmp repeatM EndMon: mov di,si mov si,0 mov bl,10 NextMBit: mov al,temp[si] mov count,di sub count,si dec count mov cx,count jcxz skipM lpmul: mul bl loop lpmul skipM: add Month,al inc si cmp si,di jne NextMBit ;-------------------------The Month is put into [Month] push dx mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop di pop si pop cx pop ax ret ExitDos: mov ah,4ch int 21h GetYearMonth endp cseg ends end start #打印模块: ;*********************************** ;入口参数:bx = Year dl=Month ;*********************************** public display data segment Year dw ? Month db ? leap db ? weekstr db " MON TUR WEN THU FRI SAT SUN",’$’ fillblank db " $" fillblank4 db " $" fillblank3 db " $" c db ? y db ? firstday db ? temp db ? MonthSize db ? data ends cseg segment assume cs:cseg,ds:data display proc far push ds mov ax,data mov ds,ax mov Year,bx mov Month,dl mov dx,0 xor bh,bh mov ah,2 int 10h mov ah,6 mov al,0 mov bh,01110000b mov ch,0 mov cl,0 mov dh,24 mov dl,79 int 10h mov ah,6 mov al,0 mov bh,01110100b mov ch,0 mov cl,25 mov dh,24 mov dl,79 int 10h call far ptr dispYM lea dx,weekstr mov ah,9 int 21h mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h call GetMonthSize ;把当前月份的天数放到MonthSize cmp Month,2 ja skip add Month,12 dec Year skip: mov bl,100 mov ax,Year div bl mov c,al mov y,ah mov cl,2 mov bl,c shr bl,cl ;int(c/4) shl c,1 ;2*c sub bl,c add bl,y shr y,cl ;int(y/4) add bl,y ;int(c/4)-2*c+y+int(y/4)--->bl inc Month xor ah,ah mov al,Month mov dx,13 mul dx mov cx,5 div cx xchg ax,bx cbw xchg ax,bx add bx,ax ;int(c/4)-2*c+y+int(y/4)+int(13*(m+1)/5) mov ax,bx mov cl,7 idiv cl cmp ah,0 jG skipAdd add ah,7 skipAdd: mov bl,ah mov firstday,bl ;--------------------------------计算出当前月份的第一天是星期几 mov cl,bl mov ch,0 dec cl jcxz skipF FillB: mov ah,9 lea dx,fillblank int 21h loop FillB skipF: mov cl,1 disLop: call dispWeek ;日期已经放入cl inc cl inc bl cmp bl,8 jb skipModle mov bl,1 mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h skipModle: cmp cl,MonthSize jbe dislop mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h pop ds ret display endp ;****************************************************************** GetMonthSize proc near push ax push dx mov leap,0 mov ax,Year mov ch,00000011b and ch,al mov bl,100 div bl mov cl,ah cmp ch,0 jne skipNLeap cmp cl,0 jne skipLeap mov ax,Year mov bx,400 mov dx,0 div bx cmp dl,0 je skipLeap skipNLeap: jmp gmsize skipLeap: inc leap gmsize: mov al,Month cmp al,2 je return2 cmp al,8 jb skipInc inc al skipInc: test al,1 jz returnEven mov MonthSize,31 jmp return returnEven: mov MonthSize,30 jmp return return2: mov MonthSize,28 cmp leap,0 je return inc MonthSize return: pop dx pop bx ret GetMonthSize endp ;***************************************************************** dispWeek proc near push cx push bx push ax push dx cmp cl,10 jae DoubleDig lea dx,fillblank4 mov ah,9 int 21h mov dl,cl add dl,30h mov ah,2 int 21h jmp back DoubleDig: mov ch,10 mov ah,0 mov al,cl div ch mov cx,ax mov ah,9 lea dx,fillblank3 int 21h mov dl,cl add dl,30h mov ah,2 int 21h mov dl,ch add dl,30h int 21h back: pop dx pop ax pop bx pop cx ret dispWeek endp ;********************************************************* dispYM proc far push bx push dx mov ax,year mov dh,10 xor si,si next: div dh mov cl,ah mov ch,0 inc si push cx mov ah,0 cmp ax,0 jne next mov cx,si repeat: pop dx mov ah,2 add dl,30h int 21h loop repeat mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h mov al,Month mov ah,0 mov bl,10 div bl mov cx,ax mov dl,cl mov ah,2 add dl,30h int 21h mov dl,ch add dl,30h int 21h mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop dx pop bx ret dispYM endp ;**************************************************** cseg ends end参考资料:buxiaode
已赞过已踩过<一、你不加盖试试结果会如何?二、全世界人民都知道吸烟有害健康,却仍有那么多的烟民!三、去问便利店的老板;四、车前亮了五、不知道六、无子西瓜种 |