2007 11 17
Saturday
题目意思很简单,给你一个日期,让你输出是星期几。。这题其实非常的蛋疼。。我写了好长。。主要思想就是求出总天数,用总天数%7。得到相应的星期几。
下面附上代码带详细解析、代码如下。。
#include <stdio.h>
#include<string.h>
void solve()
{
char str[7][12]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}; //用一个二维数组存放星期几。
int y,m,d,i;
while(~scanf("%d%d%d",&y,&m,&d)) //输入y,m,d。分别代表年月日。
{
if(y<=0 )
{
printf("illegal\n"); // 如果年份小于0,则不合法。
continue;
}
__int64 sum=0;
__int64 sum1=0;
for(i=1;i<y;i++)
{
if((i%4==0 && i%100!=0) ||i%400==0)// 找出1到(Y-1)年时一共有几个闰年。比如Y==2007,求的是1到2006有几个闰年。
sum1++;
}
sum+=(y-1-sum1)*365;// 计算1到2006非闰年的总天数。
sum+=sum1*366;// 计算1到2007闰年总天数 ,Y年(2007年)这年单独算
if((y%4==0 &&y%100!=0) ||y%400==0)// 如果这年是闰年的话
{
if(m==2 &&d>29) //2月份单独讨论。
{
printf("illegal\n");// 2月29不合法。
continue;
}
if(((m==1 || m==3 || m==5 ||m==7 || m==8 ||m==10 || m==12) &&d>31) || ((m==4 || m==6 ||m==9 ||m==11)&&d>30 ))//找出月份为30天的,大于30不合法,31天的,大于31不合法
{
printf("illegal\n");
continue;
}
if(m>12 ||m <=0)
{
printf("illegal\n");//月份大于12 或者等于0不合法
continue;
}
if(m==0 ||d==0)// 月份等于0或者天数等于0不合法。
{
printf("illegal\n");
continue;
}
if(m==1)
sum+=d;
if(m==2)
sum+=31+d;
if(m==3)
sum+=31+d+29;
if(m==4)
sum+=31+d+29+31;
if(m==5)
sum+=31+d+29+31+30;
if(m==6)
sum+=31+d+29+31+30+31;
if(m==7)
sum+=31+d+29+31+30+31+30;
if(m==8)
sum+=31+d+29+31+30+31+30+31;
if(m==9)
sum+=31+d+29+31+30+31+30+31+31;
if(m==10)
sum+=31+d+29+31+30+31+30+31+31+30;
if(m==11)
sum+=31+d+29+31+30+31+30+31+31+30+31;
if(m==12)
sum+=31+d+29+31+30+31+30+31+31+30+31+30;//以上主要是算Y年这年的总天数。
}
else //以下是非闰年的情况 将所有的29改成28就好
{
if(m==2 &&d>28)
{
printf("illegal\n");
continue;
}
if(((m==1 || m==3 || m==5 ||m==7 || m==8 ||m==10 || m==12) &&d>31)|| ((m==4 || m==6 ||m==9 ||m==11)&&d>30 ))
{
printf("illegal\n");
continue;
}
if(m>12 ||m <=0)
{
printf("illegal\n");
continue;
}
if(m==0 ||d==0)
{
printf("illegal\n");
continue;
}//以上同上
if(m==1)
sum+=d;
if(m==2)
sum+=31+d;
if(m==3)
sum+=31+d+28;
if(m==4)
sum+=31+d+28+31;
if(m==5)
sum+=31+d+28+31+30;
if(m==6)
sum+=31+d+28+31+30+31;
if(m==7)
sum+=31+d+28+31+30+31+30;
if(m==8)
sum+=31+d+28+31+30+31+30+31;
if(m==9)
sum+=31+d+28+31+30+31+30+31+31;
if(m==10)
sum+=31+d+28+31+30+31+30+31+31+30;
if(m==11)
sum+=31+d+28+31+30+31+30+31+31+30+31;
if(m==12)
sum+=31+d+28+31+30+31+30+31+31+30+31+30;//2月变成28天。
}
if(sum%7==1) //sum就是总天数了。一年一月一号是星期一。所以只要用总天数%7就能得到相应的星期几。
printf("%s\n",str[0]);
if(sum%7==2)
printf("%s\n",str[1]);
if(sum%7==3)
printf("%s\n",str[2]);
if(sum%7==4)
printf("%s\n",str[3]);
if(sum%7==5)
printf("%s\n",str[4]);
if(sum%7==6)
printf("%s\n",str[5]);
if(!(sum%7))
printf("%s\n",str[6]);
}// 问题得解
}
int main()
{
solve(); //解决问题。
return 0;
}
原文地址:http://blog.csdn.net/sky_miange/article/details/42174685