已知某一天是周几 求给定的一天是周几的算法 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\n");break;
  case TUE:printf("TUE\n");break;
  case WED:printf("WED\n");break;
  case THU:printf("THU\n");break;
  case FRI:printf("FRI\n");break;
  case SAT:printf("SAT\n");break;
  case SUN:printf("SUN\n");break;
 }
 return 0;

}
时间: 2024-10-08 22:02:28

已知某一天是周几 求给定的一天是周几的算法 C++实现的相关文章

已知圆心,半径,角度,求圆上的点坐标

圆点坐标:(x0,y0) 半径:r 角度:a0 则圆上任一点为:(x1,y1) x1   =   x0   +   r   *   cos(ao   *   3.14   /180   ) y1   =   y0   +   r   *   sin(ao   *   3.14   /180   ) 已知圆心,半径,角度,求圆上的点坐标

已知空间三点组成的面求该面上某点的Z值

已知空间三点,那么可以就可以确定空间三点组成的平面.此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值.这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值. 其算法思路也特别简单,首先算出其三点组成的平面法向量(可参看<已知三点求平面法向量>);然后根据平面法向量\(n=(A,B,C)\)和平面上某点\(m=(x0,y0,z0)\),有平面的点法式方程: \[ A(X-x0)+B(Y-y0)+C(Z-z0)=0 \] 最后根据欲求点的X.Y值,代入公式解算Z

已知六条边的边长,求四面体体积

Problem Description 杭州电子科技大学即将迎来50周年的校庆,作为校庆委员会成员的我被上级要求设计一座神秘的建筑物来迎合校庆,因此我苦思冥想了一个月,终于设计出了一套方案,这座建筑物有点象古老埃及的金字塔,不过这个神秘建筑的根基是三角形的而不是矩形的,从数学的专业角度来讲,它是四面体.当我打算上交我的设计图纸的时候发现,我不知道怎么计算这个神秘建筑的体积(我知道这座建筑的各边的尺寸),于是我找来了聪明的你来帮助我解决这个难题. Input 输入文件包含6个不超过1000的实数,

已知二叉树前序和中序,求二叉树。

如题,给出二叉树的前序遍历和中序遍历,怎么还原二叉树. 假如一个二叉树的前序遍历为:12453,中序遍历为:42513.由于这颗二叉树比较简单,可以用 凑 的方法很容易凑出符合题意的二叉树(没有写这篇文章之前,我都是用这种笨方法的..尴尬). 即如图: 那么有没有一个标准的方法来推导呢?当然是有的! 我们来分析一下这棵树的前序和中序. 先看前序:12453,第一个字符"1"肯定是整棵树root节点,这不用解释.至于第二个字符以及往后的字符就没有什么可用的信息了. 再看中序:42513,

C++ 已知两个时间(年月日)求日期差

#include<iostream> #include <ctime> using namespace std; int main() { struct tm t1 = { 0 }; struct tm t2 = { 0 }; double seconds; t1.tm_year = 2019 - 1900; t1.tm_mon = 6; t1.tm_mday = 6;//现在时间2019,7,6 t2.tm_year = 2020 - 1900; t2.tm_mon = 5; t

已知可生成0~4的rand5(),实现生成0~6的rand7()

若已知生成0~6的rand7(),求生成0~4的rand5(),则一个方法就是不断生成0~7的数,直到这个数满足0~4就返回. int rand5(){ int res; do{ res = rand7(); }while(res >4); return res; } 现在已知生成0~4的rand5(),求解生成0~6的rand7(),就是想办法利用rand5()去生成0~大于6的数字,可以使用rand5()+rand5()*5,这个式子可以生成0~24的随机数,每个数字的组成只有一种可能,所以

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

先序,中序,后序,已知两者求第三者

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2.访问根节点     3.中序遍历右子树 后序遍历:     1.后序遍历左子树     2.后序遍历右子树     3.访问

已知面积求周长

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this pap