题目描述:
输入年、月、日,计算该天是本年的第几天。
输入:
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
输出:
输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年、月、日对应本年的第几天。
样例输入:
1990 9 20 2000 5 1
样例输出:
263 122
通过数组存储每月的天数,计算天数时遍历数组即可。使用二维数组代替switch,以空间换时间。
1.switch版本
#include <stdio.h>
int IsLeap(int a){
if(a%400==0||(a%4==0&&a%100!=0))
return 1;
else
return 0;
}
int main() {
int a, b,c;
while (scanf("%d %d %d", &a, &b,&c) != EOF) {
int num=0;
switch (b) {
case 12:
num+=30;
case 11:
num+=31;
case 10:
num+=30;
case 9:
num+=31;
case 8:
num+=31;
case 7:
num+=30;
case 6:
num+=31;
case 5:
num+=30;
case 4:
num+=31;
case 3:
if(IsLeap(a))
num+=28;
else
num+=29;
case 2:
num+=31;
break;
default:
break;
}
num+=c;
printf("%d\n",num);
}
return 0;
}
case语句如果不break,则会继续运行下一个case,直到遇到break为止,本题利用这一特性简化代码。
2.数组版本
#include <stdio.h>
int IsLeap(int a) {
if (a % 400 == 0 || (a % 4 == 0 && a % 100 != 0))
return 1;
else
return 0;
}
int main() {
int a[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int year, month, day;
while (scanf("%d %d %d", &year, &month, &day) != EOF) {
int sum = 0;
int isleap = IsLeap(year);
for (int i = 0; i < month; i++) {
sum += a[isleap][i];
}
sum += day;
printf("%d\n", sum);
}
return 0;
}
以后遇到计算天数的题目,第一反应就应该是把每月的天数存在二维数组里