这道题 根据题目意思看 不难 但有点复杂
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std ;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //将12月每天的天数放入数组a
int main()
{
char c[100];
int i,b[3]={0,0,0},k=0;
fgets(c,100,stdin);//输入字符串
for(i=0;c[i];i++)
{
while(isdigit(c[i]))
b[k]=b[k]*10+c[i++]-'0';//取出数据放入b数组
k++;
}
if(b[0]%4==0&&b[0]%100!=0||b[0]%400==0)//如果年份是闰年 则2月加一天
a[1]+=1;
if(b[2]>2)//如果天数大于2 则直接-2
b[2]=b[2]-2;
else if(b[2]<=2)
{
int k;
k=2-b[2];//当前天数不够两天 则还差几天
b[1]--;//如果当前天数不够 则月数减1
if(b[1]>1)
{
b[2]=a[b[1]-1]-k;
}
else//如果当前是1月 则年数减一
{
b[0]--;
b[1]=12;
b[2]=31-k;
}
}
for(i=0;i<3;i++)
{
if(!(b[i]/10))//如果不是两位数则补0
cout << 0 << b[i] ;
else
cout << b[i] ;
if(i!=2)//年数和月数后要加-
cout << '-' ;
}
}
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split("-");//讲字符串按-分割
int year = Integer.parseInt(s[0]);//将字符转化为整形
int month = Integer.parseInt(s[1]);
int day = Integer.parseInt(s[2]);
int[] m = {31,28,31,30,31,30,31,31,30,31,30,31};
//判断闰年
if(year % 4 == 0 && year % 100 != 0 || year % 400 ==0){
m[1]=29;
}
day -= 2;
if(month == 1){
if(day == 0){
year--;
month = 12;
day = m[month-1];
}else if(day == -1){
year--;
month = 12;
day = m[month-1] - 1;
}
}else{
if(day == 0){
month--;
day = m[month-1];
}
if(day == -1){
month--;
day = m[month-1] - 1;
}
}
System.out.printf("%d-%02d-%02d",year,month,day);
}
}