时间类问题

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\n");
17     scanf("%d-%d-%d",&y,&m,&d);
18     i=fun(y,m,d);
19     switch(i)
20     {
21     case 0:
22         printf("那天是星期日\n");
23         break;
24     case 1:
25         printf("那天是星期一\n");
26         break;
27     case 2:
28         printf("那天是星期二\n");
29         break;
30     case 3:
31         printf("那天是星期三\n");
32         break;
33     case 4:
34         printf("那天是星期四\n");
35         break;
36     case 5:
37         printf("那天是星期五\n");
38         break;
39     case 6:
40         printf("那天是星期六\n");
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 }
View Code

 

posted @ 2019-04-16 15:34  北风吹沙  阅读(431)  评论(0编辑  收藏  举报