zoukankan      html  css  js  c++  java
  • 已知某一天是周几 求给定的一天是周几的算法 C++实现

    
    
    #include<iostream>
    using namespace std;
    
    struct Date{
     int year,month,day;
    };
    
    enum Week{
    MON=1,
    TUE,
    WED,
    THU,
    FRI,
    SAT,
    SUN,
    };
    
    int isLeapYear(int y)
    {
     if((y%4==0&&y%100!=0)||y%400==0)return 1;
     else return 0;
    }
    
    int DaysGone(Date d,int *restdays)
    {/*
     *返回值是某个日期在一年中是第多少天
     *restdays是这年还剩多少天
     */
     int leap=0;
     int days;
     if(isLeapYear(d.year))leap=1;
     switch(d.month){
      case 1:days=d.day;break;
      case 2:days=d.day+31;break;
      case 3:if(leap)days=d.day+29+31;
             else days=d.day+28+31;
             break;
      case 4:if(leap)days=d.day+31+29+31;
             else days=d.day+31+28+31;
             break;
      case 5:if(leap)days=d.day+30+31+29+31;
             else days=d.day+30+31+28+31;
             break;
      case 6:if(leap)days=d.day+31+30+31+29+31;
             else days=d.day+31+30+31+28+31;
             break;
      case 7:if(leap)days=d.day+30+31+30+31+29+31;
             else days=d.day+30+31+30+31+28+31;
             break;
      case 8:if(leap)days=d.day+31+30+31+30+31+29+31;
             else days=d.day+31+30+31+30+31+28+31;
             break;
      case 9:if(leap)days=d.day+31+31+30+31+30+31+29+31;
             else days=d.day+31+31+30+31+30+31+28+31;
             break;
      case 10:if(leap)days=d.day+30+31+31+30+31+30+31+29+31;
             else days=d.day+30+31+31+30+31+30+31+28+31;
             break;
      case 11:if(leap)days=d.day+31+30+31+31+30+31+30+31+29+31;
             else days=d.day+31+30+31+31+30+31+30+31+28+31;
             break;
      case 12:if(leap)days=d.day+30+31+30+31+31+30+31+30+31+29+31;
             else days=d.day+30+31+30+31+31+30+31+30+31+28+31;
             break;
      }
     if(leap)*restdays=366-days;
     else *restdays=365-days;
     return days;
    }
    
    int ComputeDays(Date early,Date later)
    {
     int leapcount=0;
     int y,earlyrestdays=0,laterrestdays=0,latergonedays=0;
     int result;
     for(y=early.year+1;y<later.year;y++)
      if(isLeapYear(y))leapcount++;//不包含要求计算的两年
     DaysGone(early,&earlyrestdays);
     latergonedays=DaysGone(later,&laterrestdays);
     result=latergonedays+earlyrestdays;
     result+=(later.year-early.year-1)*365+leapcount;
     return result; 
    }
    
    int WhoEarly(Date d1,Date d2)
    {//d1早则返回1,d2则0,=则-1
     int res=0;
     int y,m,d;
     y=d1.year-d2.year;
     m=d1.month-d2.month;
     d=d1.day-d2.day;
     if(y<0)res=1;
     else if(y==0){
          if(m<0)res=1;
           else if(m==0){
           if(d<0)res=1;
            else if(d==0)res=-1;
             else res=0;
          }//else if
          else res=0;
      }//else if
     else res=0;
    }
    
    int Mod7(Date d1,Date d2,int weekday)
    {//此处d1是周几为已知数weekday
     int tmp,res;
     tmp=WhoEarly(d1,d2);
     if(tmp==-1)res=0;
     else if(tmp==1)res=ComputeDays(d1,d2)%7;
     else res=7-ComputeDays(d2,d1)%7;
     switch(weekday){
      case MON:res=(res+1)%7;break;
      case TUE:res=(res+2)%7;break;
      case WED:res=(res+3)%7;break;
      case THU:res=(res+4)%7;break;
      case FRI:res=(res+5)%7;break;
      case SAT:res=(res+6)%7;break;
      case SUN:res=(res+7)%7;break;
     }
     return res;
    }
    
    /*
    *程序没有进行错误检查
    */
    int main()
    {
     Date d1,d2;
     int week,res;
     printf("enter a date:year month day=======");
     scanf("%d%d%d",&d1.year,&d1.month,&d1.day);
     printf("week ?");
     scanf("%d",&week);
     printf("enter another date but don't know on which weekday======");
     scanf("%d%d%d",&d2.year,&d2.month,&d2.day);
     res=Mod7(d1,d2,week);
     printf("it's ");
     switch(res)
     { 
      case MON:printf("MON
    ");break;
      case TUE:printf("TUE
    ");break;
      case WED:printf("WED
    ");break;
      case THU:printf("THU
    ");break;
      case FRI:printf("FRI
    ");break;
      case SAT:printf("SAT
    ");break;
      case SUN:printf("SUN
    ");break;
     }
     return 0;
    
    }
  • 相关阅读:
    点击单元格(LinkToAction)获取Table行号和数据(Table篇一)
    金额和数量不显示0
    自定event事件之全局初始化中自动触发(二)
    自定event事件之手动触发(一)
    Python的requests如何同时post图片二进制流和json数据application/octet-stream
    树莓派点亮LED灯需要几行代码?3行。小孩子都能学会
    50元求解pyqt加载并显示pdf问题
    pyqt5加载pdf文档失败
    建个群,互相关心
    唉,十年前的沙雕照片
  • 原文地址:https://www.cnblogs.com/rednodel/p/4074113.html
Copyright © 2011-2022 走看看