通过暴力计算,遍历每个月的天数即可。(tip:day在开始时设为0,天数加到plus上,便于处理。)

#include<bits/stdc++.h>
using namespace std;

int monthDay[2][12] = {
		{31,28,31,30,31,30,31,31,30,31,30,31},// 非闰年 
		{31,29,31,30,31,30,31,31,30,31,30,31}};// 闰年 
int isRunYear(int year) {
	return (year%4==0&&year%100!=0) || (year%400==0);
}

int main() {
	int year, month, day, plusDay;
	int n;
	while(scanf("%d", &n) != EOF) {
		for(int i=0; i<n; i++) {
			// 1992 11 22 316
			scanf("%d%d%d%d", &year, &month, &day, &plusDay);
			int runOrPing = isRunYear(year);
			plusDay += day;
			day = 0;
			while(plusDay>monthDay[runOrPing][month-1]) {
				plusDay-=monthDay[runOrPing][month-1];
				if(month == 12) {
					year++;
					month = 1;
					runOrPing = isRunYear(year);
				} else {
					month++;
				}
			}
			day = plusDay;
			printf("%d-%02d-%02d\n", year, month, day);
		} 
	}
	return 0;
}