2019.1.24HDOJ-2005 第几天? AC率34.94%(74043/211889)

这题做着还真挺费劲的,可能会有更好的做法……
我还真是菜的不能再菜了

题目

Problem-2005第几天
Problem Description
给定一个日期,输出这个日期是该年的第几天。

Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。

Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。

Sample Input
1985/1/20
2006/3/12

Sample Output
20
71

AC的代码

#include<stdio.h>
int main(void)
{
	int year,month,day;
	while(scanf("%d/%d/%d",&year,&month,&day)!=EOF){
		int February=28;
		if((year%4==0&&year%100!=0)||year%400==0)
			February=29;
		if(month<3)
			switch(month){
				case 1:
					printf("%d\n",day);
					break;
				case 2:
					printf("%d\n",31+day);
					break;
			}
		if(month>=3){
			switch(month){
				case 3:
					printf("%d\n",31+February+day);
					break;
				case 4:
					printf("%d\n",31+February+31+day);
					break;
				case 5:
					printf("%d\n",31*2+February+30+day);
					break;
				case 6:
					printf("%d\n",31*3+February+30+day);
					break;
				case 7:
					printf("%d\n",31*3+February+30*2+day);
					break;
				case 8:
					printf("%d\n",31*4+February+30*2+day);
					break;
				case 9:
					printf("%d\n",31*5+February+30*2+day);
					break;
				case 10:
					printf("%d\n",31*5+February+30*3+day);
					break;
				case 11:
					printf("%d\n",31*6+February+30*3+day);
					break;
				case 12:
					printf("%d\n",31*6+February+30*4+day);
					break;
			}
		}
		
	}
	return 0;
}

做这题的计时不怎么精确……花费时间不短……
5分01秒看题,17分35秒查询闰年判断方法+敲代码,WA,又用了8分38秒发现int February=28;写在了循环外,导致被赋过一次值29后就无法变为28了……
其实根本没必要在每个case里都写上printf(),直接在循环末尾写一个printf()就好了……
看了discuss里有其他人有更好的写法,用数组来存储各个月份天数,或者将月份倒序排列,用switch不加break,跳出前可以加一遍……

2019年1月24日19点46分

又用数组做了一遍

#include<stdio.h>
int main(void)
{
	int array[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int year,month,day;
	
	while(scanf("%d/%d/%d",&year,&month,&day)!=EOF){
		if((year%4==0&&year%100!=0)||year%400==0){
			array[1]=29;
		}
		else
			array[1]=28;
			
		int i,sum=0;
		for(i=0;i<month-1;i++){
			sum+=array[i];
		}
		sum+=day;
		printf("%d\n",sum);
	}
	return 0;
}

用数组敲起来就快多了……也不容易出错……

2019年1月24日21点41分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值