pta日期推算题显示答案错误


#include<iostream>

using namespace std;

int main()
{
    int year,m,d,num,M[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d/%d/%d",&year,&m,&d);
    scanf("%d",&num);
    
    while(num>0)
    {
    if(num>M[m-1]-d+1)                //超过本月 
    {
        if(year%400==0||year%4==0&&year%100!=0)            //闰年判断
        M[1]=29;
        num=num+d-M[m-1];
        m++;
        d=0;
        if(m>12)                //超过本年 
        {
            m=1;
            d=0;
            year++;
        }
    } 
    else
     {
        d+=num;
        break;
     }
        
    }
    

     cout<<year;
    printf("/%02d/%02d\n",m,d);
}

img


#include<iostream>

using namespace std;

int main()
{
    int year,m,d,num,M[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d/%d/%d",&year,&m,&d);
    scanf("%d",&num);

    while(num>0)
    {
        if(year%400==0||(year%4==0&&year%100!=0))            //闰年判断 应该放最前面
            M[1]=29;
        else
           M[1]=28;     //year是变的,有闰年就应该有平年

        if(num>M[m-1]-d)                //超过本月 不用再加一
        {
            num=num+d-M[m-1];
            m++;
            d=0;
            if(m>12)                //超过本年
            {
                m=1;
                d=0;
                year++;
            }
        }
        else
        {
            d+=num;
            break;
        }

    }

    printf("%4d/%02d/%02d\n",year,m,d);
}

供参考:

#include<stdio.h>
int isLeap(int y)
{
    return ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0));
}
int Getdaysofmonth(int y, int m)
{
    int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    if (m == 2 && isLeap(y))  return days[m - 1] + 1;
    return days[m - 1];
}
int main()
{
    int y, d, m, n;
    scanf("%d/%d/%d%d", &y, &m, &d, &n);
    for (m; n > Getdaysofmonth(y, m) - d; n -= Getdaysofmonth(y, m) - d, d = 0, ++m > 12 ? (m = 1, y++) : m);
    printf("%04d/%02d/%02d", y, m, n + d);
    return 0;
}