同意
by WYXkk @ 2020-01-11 13:48:42
帮你@[StudyingFather](/user/22030)
by Smile_Cindy @ 2020-02-12 08:54:10
欢迎拿数据来拍板
```cpp
#include <iostream>
using namespace std;
char m1, m2, c, d1, d2;
int month, day, ans;
//number[i]对应第i月的最大合法天数
int number[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
cin >> m1 >> m2 >> c >> d1 >> d2;
//提取月份和天数
month=(m1-'0')*10+m2-'0';
day=(d1-'0')*10+d2-'0';
//总共三种情况:
//1.月合法-天不合法
//2.月不合法-天合法
//3.月不合法-天不合法
//最简单的就是月份合法,天数不合法,则需要修改天数,修改一位即可
if(month<=12 && month>0 && day>number[month]) ans++;
//接下来考虑月份不合法,分为天合法和不合法两种
//首先处理月,月份不合法两种情况(月为0,或月大于12),月必须修改,并且只需修改一位即可
if(month==0 || month>12) ans++;
//月不合法,天合法只需要修改月,没有讨论的必要了
//下面处理月不合法-天不合法的情况下,天数需要修改的情况
//月为0,只有当天数超过31时才需要修改天数
if(month==0 && day>31) ans++;
//月大于12, 因为1,3,5,7,8,10,12每个月所允许的最大天数为31,
//所以月份大于12,并且尾数为1,2,3,5,7,8,0的月,均可以转化为1,3,5,7,8,10,12,因此他们所允许的最大天数为31
//当天数超过31时,天数不合法,需要修改天数,只修改一位即可,月份不合法所需的修改次数在前面代码中已经加过
if(month>12 && (m2-'0'==1 || m2-'0'==2 || m2-'0'==3 || m2-'0'==5 || m2-'0'==7 || m2-'0'==8 || m2-'0'==0) && day>31) ans++;
//接下来看看那些尾数为4,6,9的,很容易错误地想到他们所允许的最大天数为30
//这里要区分对待,对于14,16,19这样的非法月,均可以修改为10或者12,这样所允许的最大天数就变为31
//对于24,26,29这样的非法月,如果月份只改一位的情况下,只能改为4,6,9,这样所允许的最大天数就是30
//所以这里区分来做判断,当然假如为24-31时,你也可以将24两位都修改,改为12这样,来满足天数的合法性,
//但也你天数没改,月份改了两位,殊途同归
if((month==14 || month==16 || month==19) && day>31) ans++;
if(month>20 && (m2-'0'==4 || m2-'0'==6 || m2-'0'==9) && day>30) ans++;
//前面考虑的都是天数超出允许范围的情况,还有一种特殊就是天数为0,不论月合不合法,天数都需要修改一位
//关于月非法的修改次数前面已经计算过
if(day==0) ans++;
cout << ans;
return 0;
}
```
by asdypeij @ 2020-04-26 19:18:01