알고리즘 학습 노트(C++) - 난폭한 해결을 위한 날짜 변환

연도, 월, 일이 주어지면 해당 날짜에 일 수를 더한 날짜를 계산하십시오.

입력 정보:
첫 번째 줄에는 샘플 수 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;
}

Supongo que te gusta

Origin blog.csdn.net/m0_53327618/article/details/124513334
Recomendado
Clasificación