CSU2020期中测试模拟题1 问题 F: 计算一年中的第几天

问题 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;
	
	
}

此题应该还有更加简便的方法,在此便不多加陈述。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值