谁能告诉我在知道年月日的情况下怎么样算出是星期几
答案:3 悬赏:30 手机版
解决时间 2021-01-25 02:56
- 提问者网友:骨子里的高雅
- 2021-01-24 12:54
谁能帮我
最佳答案
- 五星知识达人网友:荒野風
- 2021-01-24 14:07
在上小学时,有一位同学和我作过这样一个游戏:他让我随便说出当年的某一月某一日,他不用看日历就能很快、准确地说出这天是星期几。
我拿来了一本日历,与他试验了几次。果然他每次都说得很快也很准。我知道他不可能把一年三百六十五天每天星期几都背下来,所以他的本事引起了我很大的兴趣。
后来我知道了他的计算方法:他心里记住了十二个数字,这十二个数字分别对应于当年的十二个月。要计算当年的某月某日是星期几,只要用那日的日数加上那月所对应的数字,然后除以7,余几就是星期几,恰好除尽就是星期日。
我清楚地记得那年的十二个月所对应的数字依次是
1,4,4,0,2,5,0,3,6,1,4,6
1994年是:5 1 1 4 6 2 4 0 3 5 1 3
这一串数字就能很快地心算出1994年任何一天是星期几。这在手头无年历可查的情况下还是有一定用处的。在那一段我们还列出了最近几年每年对应的十二个数字,用这种方法计算最近几年某年某月是星期几也都还方便。
但是要计算自古至今以至遥远未来的公元某年某月某日是星期几,因为手头很难有那一年的年历,那一年相应的十二个数字不易获得,所以那种方法不适用了。
本段要介绍的是计算我们现在使用的历法实行以来或未来公元某年某月某日是星期几的一个方法。
先介绍一个算式:
其中 是公元的年数,C是从这一年的元旦算起到这一天为止(包括这一天是内)的天数。方括号表示其中算式的整数部分,即在计算S的值时,三个方括号中只要算出商数的整数部分,把余数略去不计。
求出S的值之后,除以7,余几就是星期几;除尽了就是星期日。
例如我们计算一下西安事变发生在星期几。
解 西安事变发生在1936年12月12日,所以x=1936 C=347于是可得:
=1935+483-19+4+347=2750
2750÷7=392………6,
所以西安事变发生在星期六。
我们再来计算一下1994年12月25日是星期几;此时x=1994 C=359于是可得 :
=1993+498-19+4+359 =2835
2835÷7=405,无余数,
所以,1994年圣诞节是星期日。
这个计算方法根据的是每四年一闰、百年不闰、四百年再闰的历法,即格里历。格里历是从公元1582年开始实行的,所以,用这个方法可以计算公元1582年以后某年某月某日是星期几。
我拿来了一本日历,与他试验了几次。果然他每次都说得很快也很准。我知道他不可能把一年三百六十五天每天星期几都背下来,所以他的本事引起了我很大的兴趣。
后来我知道了他的计算方法:他心里记住了十二个数字,这十二个数字分别对应于当年的十二个月。要计算当年的某月某日是星期几,只要用那日的日数加上那月所对应的数字,然后除以7,余几就是星期几,恰好除尽就是星期日。
我清楚地记得那年的十二个月所对应的数字依次是
1,4,4,0,2,5,0,3,6,1,4,6
1994年是:5 1 1 4 6 2 4 0 3 5 1 3
这一串数字就能很快地心算出1994年任何一天是星期几。这在手头无年历可查的情况下还是有一定用处的。在那一段我们还列出了最近几年每年对应的十二个数字,用这种方法计算最近几年某年某月是星期几也都还方便。
但是要计算自古至今以至遥远未来的公元某年某月某日是星期几,因为手头很难有那一年的年历,那一年相应的十二个数字不易获得,所以那种方法不适用了。
本段要介绍的是计算我们现在使用的历法实行以来或未来公元某年某月某日是星期几的一个方法。
先介绍一个算式:
其中 是公元的年数,C是从这一年的元旦算起到这一天为止(包括这一天是内)的天数。方括号表示其中算式的整数部分,即在计算S的值时,三个方括号中只要算出商数的整数部分,把余数略去不计。
求出S的值之后,除以7,余几就是星期几;除尽了就是星期日。
例如我们计算一下西安事变发生在星期几。
解 西安事变发生在1936年12月12日,所以x=1936 C=347于是可得:
=1935+483-19+4+347=2750
2750÷7=392………6,
所以西安事变发生在星期六。
我们再来计算一下1994年12月25日是星期几;此时x=1994 C=359于是可得 :
=1993+498-19+4+359 =2835
2835÷7=405,无余数,
所以,1994年圣诞节是星期日。
这个计算方法根据的是每四年一闰、百年不闰、四百年再闰的历法,即格里历。格里历是从公元1582年开始实行的,所以,用这个方法可以计算公元1582年以后某年某月某日是星期几。
全部回答
- 1楼网友:佘樂
- 2021-01-24 17:19
设D = (N, M, d) (年, 月, 日)
把M减去2,如果小于0,就加上12,得到的数记为m
如果M>=3,记n=N
如果M<=2,记n=N-1
用欧几里德除法
得c, y 使: n = 100c + y, (0<=y<100)
则 W = d + [13m/5] + y + [y/4] + [c/4] - 2c (mod 7)
则就是星期
星期天=0
星期一=1
....
例如:
D = (2002, 5, 8)
则m=3
n=8
d=8
c=20
y=2
则W = 8 + [13*3/5] + 2 + [2/4] + [20/4] - 40 (mod 7)
= -18 (mod 7) = 3 (mod 7)
是星期三!
- 2楼网友:从此江山别
- 2021-01-24 15:40
没必要那么麻烦,即使不用calendar也可以用date啊,虽然已经不被鼓励使用了
date date = new date() ;
date.setyear(n) ;
date.setmonth(y+1) ;
date.setdate(t) ;
system.out.println(date.getday()+1) ;
e = date.getday()+1 ;
这样直接就获取是星期几了,e就是星期几
如果你实在是想练习一下switch的话,main函数我改了,以下:
public static void main( string[] args )
{
int d , n , y , t , x , e , a ;
n = integer.parseint(joptionpane.showinputdialog("请输入年号")) ;
y = integer.parseint(joptionpane.showinputdialog("请输入月份")) ;
t = integer.parseint(joptionpane.showinputdialog("请输入几号")) ;
d = n + (n - 1) / 4 - (n - 1) / 100 + (n - 1) / 400 ;
if ( n % 4 == 0 )
a = 28 ;
else
a = 29 ;
switch (y)
{
case 1 :
x = t - 1 ;
break ;
case 2 :
x = t + 30 ;
break ;
case 3 :
x = a + t + 30 ;
break ;
case 4 :
x = a + t + 31 + 30 ;
break ;
case 5 :
x = a + t + 31 + 30 + 30 ;
break ;
case 6 :
x = a + t + 31 + 30 + 31 + 30 ;
break ;
case 7 :
x = a + t + 31 + 30 + 31 + 30 + 30 ;
break ;
case 8 :
x = a + t + 31 + 30 + 31 + 30 + 30 + 31 ;
break ;
case 9 :
x = a + t + 31 + 30 + 31 + 30 + 30 + 31 + 31 ;
break ;
case 10 :
x = a + t + 31 + 30 + 31 + 30 + 30 + 31 + 31 + 30 ;
break ;
case 11 :
x = a + t + 31 + 30 + 31 + 30 + 30 + 31 + 31 + 30 + 31 ;
break ;
case 12 :
x = a + t + 31 + 30 + 31 + 30 + 30 + 31 + 31 + 30 + 30 + 31 ;
break ;
default :
x = 0 ;
break ;
}
e = (d + x) % 7 ;
if ( e == 0 )
joptionpane.showmessagedialog(null, "这天是星期天") ;
if ( !(e == 0) )
joptionpane.showmessagedialog(null, "这天是星期" + e) ;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯