时间类问题
Posted bfcs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间类问题相关的知识,希望对你有一定的参考价值。
1.闰年判断,4年一闰,100年不闰,400年再闰
1 bool isLeap(int year){ 2 return (year%4==0&&year%100!=0)||(year%400==0); 3 }
闰年2月---29 平年2月-----28
4、6、9、11月------------30
其他月份则为31天
2.求指定日期是星期几
基姆拉尔森计算公式: w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7
结果对应关系 0:星期日 1:星期一 2:星期二 ........... 6:星期六
注意:需要把一月和二月看成是上一年的十三月和十四月
列:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int fun(int y,int m,int d){ 6 if(m==1||m==2){ //需要把一月和二月看成是上一年的十三月和十四月 如果是2004-1-10 则换算成2003-13-10来代入公式计算 7 m+=12; 8 y--; 9 } 10 return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7; 11 } 12 13 int main() 14 { 15 int i,y,m,d; 16 printf("请输入要判断的日期,格式为:y-m-d "); 17 scanf("%d-%d-%d",&y,&m,&d); 18 i=fun(y,m,d); 19 switch(i) 20 { 21 case 0: 22 printf("那天是星期日 "); 23 break; 24 case 1: 25 printf("那天是星期一 "); 26 break; 27 case 2: 28 printf("那天是星期二 "); 29 break; 30 case 3: 31 printf("那天是星期三 "); 32 break; 33 case 4: 34 printf("那天是星期四 "); 35 break; 36 case 5: 37 printf("那天是星期五 "); 38 break; 39 case 6: 40 printf("那天是星期六 "); 41 break; 42 default: 43 printf("输入错误!"); 44 break; 45 } 46 return 0; 47 }
3.几天后是几年几月几号(如高斯日记和星系炸弹)
高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int year=1777,month=4,day=30; 6 7 bool isLeap(){ //闰年判断 8 return (year%4==0&&year%100!=0)||(year%400==0); 9 } 10 11 int isEndofMonth(){ //判断是否月末 12 switch(month) 13 { 14 case 4: 15 case 6: 16 case 9: /*如果是4,6,9,11月则判断day是否到了30,如果是则表示到了月末了*/ 17 case 11: 18 return day==30; 19 case 2: //2月先判断是否闰年 20 if (isLeap()) 21 return day==29; //如是闰年 判断day是否到了29,如果是则表示到了月末了 22 else 23 return day==28; //如不是闰年 判断day是否到了28,如果是则表示到了月末了 24 default: 25 return day==31; //既不是4,6,9,11月也不是2月,则判断day是否到了31,如果是则表示到了月末了 26 } 27 } 28 29 void incDay(){ 30 if (isEndofMonth())//判断是否是月末 31 { 32 if(month==12){//年末 33 day=1;month=1;year++; 34 } 35 else{ 36 day=1;month++; 37 } 38 } 39 else{ //既不是月末,也不是年末 40 day++; 41 } 42 } 43 44 void addDay(int days){ 45 for(int i=1;i<days;i++) 46 incDay(); 47 } 48 49 int main() 50 { 51 addDay(5343); 52 cout<<year<<"-"<<month<<"-"<<day<<endl; 53 return 0; 54 }
以上是关于时间类问题的主要内容,如果未能解决你的问题,请参考以下文章