トピック 2571: 2020 年第 11 回蘭橋杯省大会の本当の問題 - 回文の日付

この問題には落とし穴がたくさんありますが、注意しないと80点から90点しか取れないのでちょっと落とし穴があります。

総当たり検索で十分です。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int monthd[13] = {31,28,31,30,31,31,30,31,30,31,30,31,29};//日期题目通用数组
int tf(int num){//判断是否回文数
	string s;
	while(num>0){
		s.push_back(num%10+'0');
		num/=10;
	}
	if(s[0]==s[2]&&s[2]==s[5]&&s[5]==s[7]&&s[1]==s[3]&&s[3]==s[4]&&s[4]==s[6]){//特殊回文数,1成立也代表0成立。
		return 1;
	}
	else if(s[0]==s[7]&&s[1]==s[6]&&s[2]==s[5]&&s[3]==s[4]){
		return 0;
	}
	else return -1;//都不是返回-1;
}
int main(){
	int N;
	cin>>N;
	int year = N/10000;
	int month = (N % 10000)/100;
	int day = N % 100;
	bool a = false,b = false;
	for(int i = year;i <= 10000; i++){//这里题目说明N<=8999但是答案不一定小于8999,要小心描述陷阱
		for(int j = 1;j <= 12; j++){//月份
			int k = monthd[j-1];//这里直接给天数赋值
			if(year%4==0)
				k = monthd[12];//闰年2月取29天
			for(int l = 1;l <= k; l++){
				if(a&&b){//如果都找到了,直接return 0;
				return 0;
				}
				int ymd = i * 10000 + j * 100 + l;
				if(ymd==N)continue;//起点不能算进内
				if(tf(ymd)==1&&!a){//找到特殊回文日期
					a = true;
					cout<<ymd<<endl;
					if(!b){//假如b还没找到,一并输出
						b = true;
						cout<<ymd<<endl;
					}
				}
				if(tf(ymd)==0&&!b){//普通的先找到
					b = true;
					cout<<ymd<<endl;
				}
			}
		}
	}
	return 0;
}

3 つの詳細: 

1. 見つかった数が開始点と同じであってはなりません。

2. 共通のものを見つける前に特殊なものを見つけることができます. このとき、条件を追加して特殊なものを再度出力する必要があります.

3. タイトルの説明年の範囲は、タイトルのソリューションとは異なります. 境界が決定されていない場合, 減点されます.

おすすめ

転載: blog.csdn.net/qq_63499305/article/details/129967347