问题 F: 计算一年中的第几天
题目描述
今年的第几天?
输入年、月、日,计算该天是本年的第几天。
输入
多组样例,每组样例包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
输出
输出一个整数,代表Input中的年、月、日对应本年的第几天。
样例输入
1990 9 20
2000 5 1
样例输出
263
122
此题中我只用到了类似枚举(其实本质就是枚举的做法),所以做的有点麻烦,代码有些长,抱歉。
解法一(利用减法来做):
AC代码如下:
#include <stdio.h>
int main(void){
int Y,M,D,X,Z;
while(~scanf("%d %d %d",&Y,&M,&D)){
if(M>=8){
//分为闰年与非闰年
if(Y%4==0){
if(M%2==0) X=31+(12-M)/2*30+(12-M)/2*31;
//M>=8的时候,8月有31天,9月有30天.....可以知道奇数月有30天,偶数月有31天,不难得出以上式子
else X=30+(12-M+1)/2*31+30*((12-M+1)/2-1);
//同理即可
Z=366-X+D;
//X中已经删去了M月的天数,所以还要加上个D
printf("%d\n",Z);
}else if(Y%4!=0){
if(M%2==0) X=31+(12-M)/2*30+(12-M)/2*31;
else X=30+(12-M+1)/2*31+30*((12-M+1)/2-1);
Z=365-X+D;
printf("%d\n",Z);
}//同理
}else if(M==1) printf("%d\n",D);
else if(M==2) printf("%d\n",D+31);//将一月二月单独拿出
else if(M>2&&M<8){
//分为闰年和非闰年
if(Y%4==0){
if(M%2!=0) X=153+(7-M)/2*30+(7-M)/2*31+31;
//当M<8&&M>2时,也通过减法来实现,先减去8、9....的天数,然后在3~7月间,奇数月有31天,偶数月只有30天,容易得出X的值
else X=153+30+(7-M+1)/2*31+((7-M+1)/2-1)*30;
Z=366-X+D;
printf("%d\n",Z);
}else if(Y%4!=0){
if(M%2!=0) X=153+(7-M)/2*30+(7-M)/2*31+31;
else X=153+30+(7-M+1)/2*31+((7-M+1)/2-1)*30;
Z=365-X+D;
printf("%d\n",Z);
}
}
}
return 0;
}
解法二(暴力法):此块代码无需解释,直来直去
AC代码如下
#include <stdio.h>
int main ()
{
int a,b,c,d;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a%400==0||(a%4==0&&a%100!=0))
{
switch(b)
{
case 1:d=c;break;
case 2:d=31+c;break;
case 3:d=31+29+c;break;
case 4:d=31+29+31+c;break;
case 5:d=31+29+31+30+c;break;
case 6:d=31+29+31+30+31+c;break;
case 7:d=31+29+31+30+31+30+c;break;
case 8:d=31+29+31+30+31+30+31+c;break;
case 9:d=31+29+31+30+31+30+31+31+c;break;
case 10:d=31+29+31+30+31+30+31+31+30+c;break;
case 11:d=31+29+31+30+31+30+31+31+30+31+c;break;
case 12:d=31+29+31+30+31+30+31+31+30+31+30+c;break;
}
}
else
switch(b)
{
case 1:d=c;break;
case 2:d=31+c;break;
case 3:d=31+28+c;break;
case 4:d=31+28+31+c;break;
case 5:d=31+28+31+30+c;break;
case 6:d=31+28+31+30+31+c;break;
case 7:d=31+28+31+30+31+30+c;break;
case 8:d=31+28+31+30+31+30+31+c;break;
case 9:d=31+28+31+30+31+30+31+31+c;break;
case 10:d=31+28+31+30+31+30+31+31+30+c;break;
case 11:d=31+28+31+30+31+30+31+31+30+31+c;break;
case 12:d=31+28+31+30+31+30+31+31+30+31+30+c;break;
}
printf("%d\n",d);
}
return 0;
}
此题应该还有更加简便的方法,在此便不多加陈述。