第一步,存储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