这题做着还真挺费劲的,可能会有更好的做法……
我还真是菜的不能再菜了
题目
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分