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;
    
    }
  • 相关阅读:
    Java学习
    机器学习
    机器学习
    Java 学习
    哈希表复习
    [转] 数据库设计步骤
    Java
    c++的函数重载-笔记
    进程与线程-笔记
    内存知识-笔记
  • 原文地址:https://www.cnblogs.com/rednodel/p/4074113.html
Copyright © 2011-2022 走看看