题目

  1. 编写程序,输入一个日期,输出该日期是周几。

思路

选择一个基准日期,比如2018年2月18日,这一天是周日。然后将输入日期与基准日期所差的天数代入以下公式即可:
输入日期在基准日期之前的用 (7-days%7)%7
输入日期在基准日期之后的用 days%7

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//一个日期距离年初的天数
int day_count(int y,int m,int d)
{
    int i;
    int days=0;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    for(i=0;i<m;i++)
    {
        days+=a[i];
    }
    days+=d;
    if(m>2 && (0==y%4 && 0!=y%100 || 0==y%400))
    {
        days++;
    }
    return days;
}


int main()
{
    //选择2018年2月18日为基准日期,这一天是周日
    int y1,y2=2018;
    int m1,m2=2;
    int d1,d2=18;
    int a,b,i,c;
    int days,flag;
    printf("请输入年月日:");
    while(fflush(stdin),scanf("%d %d %d",&y1,&m1,&d1)!=EOF)
    {
        c=0;
        a=day_count(y1,m1,d1);
        b=day_count(y2,m2,d2);
        if(y1<y2)
        {
            for(i=y1;i<y2;i++)
            {
                if(i%4==0 && i%100!=0 || i%400==0)
                {
                    c++;
                }

            }
            days=b-a+(y2-y1)*365+c;
        }else{
            for(i=y2;i<y1;i++)
            {
                if(i%4==0 && i%100!=0 || i%400==0)
                {
                    c++;
                }

            }
            days=a-b+(y1-y2)*365+c;
        }

        if((y1<y2) || (y1==y2 && m1<m2) ||(y1==y2 && m1==m2 && d1<d2))
        {
            flag=(7-days%7)%7;
        }else{
            flag=days%7;
        }
        switch(flag)
        {
        case 1:printf("是周一");break;
        case 2:printf("是周二");break;
        case 3:printf("是周三");break;
        case 4:printf("是周四");break;
        case 5:printf("是周五");break;
        case 6:printf("是周六");break;
        case 0:printf("是周日");break;
        }
        printf("\n请输入年月日:");
    }

    system("pause");
}

执行结果
图片说明