연도, 월, 일이 주어지면 해당 날짜에 일 수를 더한 날짜를 계산하십시오.
입력 정보:
첫 번째 줄에는 샘플 수 m을 입력하고 다음 m 줄에는 각 줄에 년, 월, 일 및 추가된 일 수를 나타내는 4개의 정수를 입력합니다.
출력 정보:
출력 m 라인, 각 라인은 "2001-01-01"과 같은 "04d-02d-02d" 형식으로 출력됩니다.
분석:
먼저 현재 연도의 날짜를 계산하고, 지난 일수를 더하고 "교차 연도" 상황이 있는지 판단하고, 있을 경우 연도를 업데이트하고, 마지막으로 총 일수를 날짜로 변환할 수 있습니다. 형태.
참고: 다음과 같이 지정된 형식의 출력에 대해
- %2d는 너비가 2인 정수를 출력한다는 의미입니다. 2자리를 초과하면 실제 상황에 따라 출력되고, 그렇지 않으면 오른쪽 정렬되어 출력됩니다.
- %02d는 출력 필드 너비가 2인 정수를 나타내며, 2자리를 초과하면 실제 상황에 따라 출력되고 그렇지 않으면 0~2자리로 채워집니다.
- %5.2f는 필드 너비가 5인 부동 소수점 숫자를 출력한다는 의미입니다. 5자리 미만이면 출력이 오른쪽 정렬되고 소수점 뒤에 2자리가 예약됩니다.
# include <cstdio>
# include <iostream>
using namespace std;
// if this year a "RUN" year
int isRunYear(int year){
if ((year%4==0 && year%100!=0) || (year%400==0)){
return 1;
}
else{
return 0;
}
}
// how many days in every month
int monthTable[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 dayInYear[2] = {
355,356};
int main(){
int casenumber;
cin >> casenumber;
while(casenumber--){
int year, month, day, moreday;
int total = 0;
cin >> year >> month >> day >> moreday;
int row = isRunYear(year);
// first compute the total day now
for (int i=0; i < month; ++i){
total += monthTable[row][i];
}
total += day + moreday;
// plus more days and judge if the years increased
while(total > dayInYear[isRunYear(year)]){
total -= dayInYear[isRunYear(year)];
year += 1;
}
// renew the data
row = isRunYear(year);
month = 0;
for ( ; total>monthTable[row][month]; ++month){
total -= monthTable[row][month];
}
day = total;
// output
printf("%04d-%02d-%02d", year, month, day);
}
return 0;
}