相关问题
使用C进行编写,解决思路如下:
- 判断对应年是否为闰年,闰年的判断是可以被4整除,但是不能被100整除,或者可以被400整除
- 累加每个月的天数,如果对应的天数小于对应月的累加,则判断为当前月
- 注意边界值,如1和366
相应C代码如下:
#include <stdio.h>
int isLeap(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int month[13][2] = {{0, 0},
{31, 31},
{28, 29},
{31, 31},
{30, 30},
{31, 31},
{30, 30},
{31, 31},
{31, 31},
{30, 30},
{31, 31},
{30, 30},
{31, 31}};
int day1[13] = {0};
int day2[13] = {0};
int a = 0, b = 0, year, day, tmp;
for (int i = 0; i < 13; ++i) {
a = a + month[i][0];
b = b + month[i][1];
day1[i] = a;
day2[i] = b;
}
while (scanf("%d%d", &year, &day) != EOF) {
if (day <= 366 && day >= 1) {
if (isLeap(year) > 0) {
if (day < day2[12]) {
for (int j = 0; j < 13; ++j) {
if (day2[j] > day) {
if (day > day2[j - 1]) {
tmp = day - day2[j - 1];
} else if (day == day2[j - 1]) {
tmp = month[j - 1][1];
j = j - 1;
} else {
tmp = day2[j - 1] - day;
}
printf("%04d-%02d-%02d\n", year, j, tmp);
break;
}
}
}else{
printf("%04d-%02d-%02d\n", year, 12, 31);
}
} else {
if(day<day1[12]){
for (int j = 0; j < 13; ++j) {
if (day1[j] > day) {
if (day > day1[j - 1]) {
tmp = day - day1[j - 1];
} else if (day == day1[j - 1]) {
tmp = month[j - 1][0];
j = j - 1;
} else {
tmp = day1[j - 1] - day;
}
if (tmp == 0) {
tmp = 1;
}
printf("%04d-%02d-%02d\n", year, j, tmp);
break;
}
}
}else{
printf("%04d-%02d-%02d\n", year, 12, 31);
}
}
} else {
break;
}
}
return 0;
}