zoukankan      html  css  js  c++  java
  • C语言 · 日期计算

    算法提高 日期计算  
    时间限制:1.0s   内存限制:256.0MB
        
    问题描述
      已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
    输入格式
      输入只有一行
      YYYY MM DD
    输出格式
      输出只有一行
      W
    数据规模和约定
      1599 <= YYYY <= 2999
      1 <= MM <= 12
      1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
      1 <= W <= 7,分别代表周一到周日
    样例输入
    2011 11 11
    样例输出
    5
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 /*判断闰年函数:四年一闰,百年不闰,四百年再闰.*/
     4 bool leap(int year){
     5     if(year%4==0 && year%100!=0)
     6         return true;
     7     if(year%400==0)
     8         return true;
     9     return false;
    10 }
    11 /*年份带来的天数差*/
    12 getDay1(int year){
    13     int sum=0;//记录年份带来的天数差
    14     if(year<=2011){
    15         for(int i=year;i<2011;i++){
    16             if(leap(i))
    17                 sum+=366;
    18             else
    19                 sum+=365;
    20         }
    21     }
    22     if(year>2011){
    23         for(int i=2011;i<year;i++){
    24             if(leap(i))
    25                 sum+=366;
    26             else
    27                 sum+=365;
    28         }
    29     }
    30     return sum;
    31 }
    32 /*月份带来的天数差*/
    33 int getDay2(int year,int mon,int day){
    34     int sum=0;//记录月份带来的天数差
    35     for(int i=1;i<mon;i++){
    36         if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
    37             sum+=31;
    38         }
    39         if(i==4 || i==6 || i==9 || i==11){
    40             sum+=30;
    41         }
    42         if(i==2 && leap(year)){
    43             sum+=29;
    44         }
    45         if(i==2 && !leap(year)){
    46             sum+=28;
    47         }
    48     }
    49     sum = sum + day;
    50     return sum-1;//加到基准天数时其实多加了1 
    51 }
    52 /*
    53 在得出天数之后,还要分情况,首先将得到的天数差day%7,得到星期差;
    54 
    55 (1)如果给出的年份小于等于基础年份,那么应该从基础时间(星期六)
    56     向负方向数day%7天,注意1之后要变成7;
    57     
    58 (2)如果给出的年份大于基础年份,那么应该从基础时间(星期六)
    59     向正方向数day%7天,注意7之后要变成1.
    60     
    61 注:abs():取绝对值函数。 
    62 */
    63 int main(){
    64     int year,month,day;
    65     scanf("%d%d%d",&year,&month,&day);
    66     int sum=getDay1(year);//得到年份带来的天数差
    67     if(year<2011){
    68         sum = sum-getDay2(year,month,day);
    69         int ans = sum%7;
    70         printf("%d",ans==6?7:abs(6-ans));
    71     }else{
    72         sum = sum+getDay2(year,month,day);
    73         int ans = sum%7;
    74         printf("%d",(6+ans)>7 ? ((6+ans)%7) : (6+ans));
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    SSD报告
    House of Spirit学习调试验证与实践
    怎样改动SharePoint管理中心的语言
    PuTTY连接Linuxserver常常断线解决方式
    HDU 2819 Swap (行列匹配+输出解)
    HDOJ--1061--Rightmost Digit
    POJ Cow Exhibition
    程序员之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)
    java之 ------ 图形界面(三)
    Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6646010.html
Copyright © 2011-2022 走看看