审题:
本题需要我们判断以八位数确定的日期范围中是否存在回文数
思路:
方法一:枚举法1.确定枚举对象:
对象1:八位数日期,所需枚举次数:10^8
对象2:年,所需枚举次数:10^3
因为回文的特性,每一年只有一中特定的月日可以构成回文,所以我们只需要枚举年,然后求出对应的月日是否合法与在数据范围内,没问题就answer++
对象三:月日,所需枚举次数:372
我们枚举月日,然后根据月日反推回文情况下的年,这种情况下的日期是合法的,此时我们再判断是否在数据范围内,在就answer++
2.确定枚举顺序:
由于本题一定需要枚举所有情况,所以选择顺序即可
3.确定枚举类型:
普通枚举
解题:
#include<iostream> using namespace std; int date1, date2; int day[] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; int answer; int main() {cin >> date1 >> date2;for (int i = 1; i <= 12; i++)//月份{for (int j = 1; j <= day[i]; j++)//日{int year = j % 10 * 1e3 + j /10 * 1e2 + i % 10 * 10 + i / 10;int num = year * 1e4 + i * 1e2 + j;if (num <= date2 && num >= date1){answer++;}}}cout << answer;return 0; }
首先我们求出year:
根据回文特性,我们需要将日的最后一位放到年的第一位,所以取余求出日的最后一位后乘1000,日的最高位当年的第二位,除10之后乘100即可。月份求解同理
然后我们求出最终num:
将year乘10000放在八位数的前四位,剩下的月乘100,放在第五第六位,日就直接加上放在第七第八位
如果最后处于输入的数据范围内,answer++
记录详情 - 洛谷 | 计算机科学教育新生态