描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
示例1
输入:
2000 3 2000 31 2000 40 2000 60 2000 61 2001 60
复制输出:
2000-01-03 2000-01-31 2000-02-09 2000-02-29 2000-03-01 2001-03-01
答案1
#include <stdio.h>
// 判断闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算日期
void calculateDate(int year, int day, int *month, int *date) {
*month = 1;
while (1) {
switch (*month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if (day > 31) {
day -= 31;
(*month)++;
} else {
*date = day;//有31天的月份
return;
}
break;
case 4: case 6: case 9: case 11:
if (day > 30) {
day -= 30;
(*month)++;
} else {
*date = day;//有30天的月份
return;
}
break;
case 2://2月
if (isLeapYear(year)) {//是闰年2月有29天
if (day > 29) {
day -= 29;
(*month)++;
} else {
*date = day;//2月
return;
}
} else {//不是闰年,2月有28天
if (day > 28) {
day -= 28;
(*month)++;
} else {
*date = day;
return;
}
}
break;
}
}
}
int main() {
int year, day;
while (scanf("%d %d", &year, &day) == 2) {
int month, date;
calculateDate(year, day, &month, &date);
printf("%04d-%02d-%02d\n", year, month, date);
}
return 0;
}
详解1
在C语言中,使用&
符号表示取地址操作符。当我们在函数中使用指针参数时,我们通常会将变量的地址传递给函数,以便函数可以直接修改该变量的值。在这种情况下,&
用于获取变量的地址。
在函数调用中,如果我们想要修改一个变量的值,并且该变量是通过指针参数传递给函数的,我们就需要将该变量的地址传递给函数。因此,&
符号用于获取该变量的地址。
例如,在函数调用中使用&
符号时,&month
和&date
表示取得month
和date
变量的地址,然后将这些地址传递给函数,使函数能够通过指针参数来修改这些变量的值。
在C语言中,switch
语句后面的case
标签通常是一个具体的值,但也可以是一个常量表达式。这意味着case
后面可以是一个常量、变量、宏或者是一个常量表达式但不可以是一个范围。
如果case
后面是一个常量表达式,编译器会在编译时计算它的值。这使得我们可以在case
标签中使用常量之外的值,例如枚举常量、宏定义或者是计算得到的值。
%04d-%02d-%02d
是 C 语言中的格式控制字符串,用于在 printf
函数中格式化输出。在这个格式控制字符串中:
%04d
表示打印一个整数,最少占据4位,不足的地方用0填充。这通常用于年份的输出,确保年份以4位数字的形式打印出来。%02d
表示打印一个整数,最少占据2位,不足的地方用0填充。这通常用于月份和日期的输出,确保月份和日期以两位数字的形式打印出来。
因此,%04d-%02d-%02d
用于打印一个日期,其格式为"yyyy-mm-dd",其中年份以4位数字形式打印,月份和日期都以两位数字形式打印。
这个程序实现了根据给定的年份和一年中的第n天来计算日期,并以"yyyy-mm-dd"的格式输出结果。
1.首先,程序包含一个函数 isLeapYear()
,用于判断给定的年份是否是闰年。这个函数返回1表示是闰年,返回0表示不是。
2.然后,calculateDate()
函数负责计算日期。它接受四个参数:年份、第n天、月份和日期。在这个函数中,我们使用了 switch
和 case
语句来根据月份计算日期。每个 case
表示一个月份,根据月份的天数来判断日期是否超出当前月份,如果超出了,则减去当前月份的天数并进入下一个月份的判断。在每个 case
中,如果日期未超出当前月份的天数,就将日期设置为当前天数,并返回结果。
3.在 main()
函数中,程序不断从标准输入中读取年份和第n天,然后调用 calculateDate()
函数计算日期,并使用 printf()
函数按照要求的格式输出结果。这个过程在一个循环中不断进行,直到输入结束。
答案2
#include <stdio.h>
// 判断闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算月份和日期
void calculateDate(int year, int day, int *month, int *date) {
int daysPerMonth[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
*month = 1;
*date = day;
while (*date > daysPerMonth[*month - 1]) {
*date -= daysPerMonth[*month - 1];
(*month)++;
}
}
int main() {
int year, day;
while (scanf("%d %d", &year, &day) == 2) {
int month, date;
calculateDate(year, day, &month, &date);
printf("%04d-%02d-%02d\n", year, month, date);
}
return 0;
}
详解2
将每月天数封装在daysPerMonth[ ]数组中,二月通过判断是否为闰年来确定二月的天数是否+1。代码较为简洁,建议采用。