判断2015年中每一天是星期几

第一步,存储2015年每个月的当月总天数。

因为年份固定为2015年,所以我这里直接判定2015是平年(2月份为28天)。

通过设定数组d和变量i,将2015年中每一个月的当月总天数存储起来

i由1开始循环直至12,循环过程中通过if判定,为数组d赋值


    int a,b,c,d[13],i,e[13]={0};
    for(i=1;i<=12;i++)
    {
        if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
            d[i]=31;
        if(i==4||i==6||i==9||i==11)
            d[i]=30;//平年每月对应的天数
        if(i==2)
            d[i]=28;
    }

d[i]中的i在这里就可以理解为月份,通过if判定当,i={1,3,5,7,8,10,12}中的任意一直时,

将d[i]赋值为31,当i={4,6,9,11}中任意一直时,将d[i]赋值为30,当d[i]=2时,将d[i]赋值

为28,即d[2]=28,如此第一步达成,这里可以用输出函数验证一下。

printf("%d\n",d[i]);

第二步,计算每个月最后一天至1.1号的天数。


    int a,b,c,d[13],i,e[13]={0};
    for(i=1;i<=12;i++)
    {
        if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
            d[i]=31;
        if(i==4||i==6||i==9||i==11)
            d[i]=30;//平年每月对应的天数
        if(i==2)
            d[i]=28;
        e[i]+=d[i]+e[i-1];//从第一天起,每月直到最后一天的天数
    }
    

这里把用于存储每月最后一天至1.1号天数的e也放入i的循环当中,即e[i]

这里我用于求至1.1号天数的方法为“当月天数+之前月份的总天数”

下面这种写法可能好理解一些

 e[i]=d[i];//当月天数
 e[i]+=e[i-1];//加上前几个月的天数总和

还是拿输出函数printf验证一下

printf("%d\n",e[i]);   

第二步达成,来到最后一步计算出最后结果

 c=(e[a]-(d[a]-(b-1))+4)%7;
 //{当月至1月1号的最大天数-[当月天数-(已过天数b-1)]+4}%7
 //b当天还未结束,所以减1,从星期四算起,所以加4
 //一个星期为7天,所以求余7,每7天一循环,余数为几,就是星期几

 这里我拿a来存储用户输入的月份,b存储用户输入的已过天数

即当月天数为d[a],当月已过天数为b

我用“当月天数”减去“当月已过天数”就可以得到“当月剩余天数”

当月天数-当月已过天数=当月剩余天数

应为当天还没过,所以已过天数还要减去一个1,也就是剩余天数要加1

当月天数-(当月已过天数-1)=当月剩余天数

我再用前面循环计算并存储起来的1.1号至当月最后一天的天数减去当月剩余天数

就可以得到1.1号至用户输入日期之间的天数,我用这个天数去求余7的余数应当就是

当日的一个星期数

不过这里,属于是默认2015年的1月1号是星期一,但,2015年1月1号是星期四

所以我们应当从星期四算起,很好表达,星期四吗,就是过了4天啊,在求余之前再

加上四就可以了。

完整代码如下

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a,b,c,d[13],i,e[13]={0};
    for(i=1;i<=12;i++)
    {
        if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
            d[i]=31;
        if(i==4||i==6||i==9||i==11)
            d[i]=30;//平年每月对应的天数
        if(i==2)
            d[i]=28;
        //printf("%d\n",d[i]);
        e[i]+=d[i]+e[i-1];//从第一天起,每月直到最后一天的天数
        //printf("%d\n",e[i]);
    }
    while(1)
    {
    printf("请输入月份: ");
    scanf("%d",&a);
    printf("请输入天数:");
    scanf("%d",&b);
    c=(e[a]-(d[a]-(b-1))+4)%7;
    //{当月至1月1号的最大天数-[当月天数-(已过天数b-1)]+4}%7
    //b当天还未结束,所以减1,从星期四算起,所以加4
    if(c==0)
    {
        printf("2015年的%d月%d日是星期日\n",a,b);
        printf("\n");
    }
    else
    {
        printf("2015年的%d月%d日是星期%d\n",a,b,c);
        printf("\n");
    }
    }
    return 0;
}

最后最后,再提一嘴,这个方法还有另一种算法如下(这个题还有很多其它方法可以解决)

 c=(e[a-1]+b-1+4)%7;

应该不难理解吧

上个月最后一天至1.1号的天数+已过天数去求余7

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值