蓝桥杯 — — 完全日期

完全日期

友情链接:完全日期

题目:

思路:

直接从20010101枚举到20211231,然后再判断每一个数是否是一个合法的日期,如果这个日期是合法的,接着判断这个日期的每一个位置上的数字之和是否是一个完全平方数即可。

  1. 判断日期是否合法:

    可以使用一个数组来记录所有的月份对应的天数,存在特例:2月在闰年的时候是29天,在平年的时候是28天。我们可以在每次判断是闰年的时候将数组中2月份的值更改为29天,然后判断完后再将其进行恢复为28天。

    判断闰年:这个年份能对400整除或者这个年份能对4整除且不能整除100


  2. 判断是否是一个完全平方数:

    因为对于给定范围的年份,其范围是有限的,对于这道题给出的日期一共有8位数,也就是说每个位置上的数最大取的是9,最小取的是0,对应的所有位置最大值的和是 8 × 9 8 \times 9 8×9,最小值的和0,为了更快的知道这个求和出来的值是否是一个完全平方数,我们可以使用一个哈希表将这些值的完全平方数进行存储下来,这样每次查找的时间就变为了 O ( 1 ) O(1) O(1),我们开辟大小为80的数组内存空间(开80个大小是因为所有年份的完全平方数的范围为: 0 0 0 ~ 8 × 9 = 72 8 \times 9 = 72 8×9=72 ),对1 ~ 9的平方进行标记,表示该范围内的所有完全平方数。

代码:

cpp 复制代码
// 完全日期
#include<iostream>
#include<string>
using namespace std;

int hashMap[80];  // 定义一个哈希数组,用于记录完全平方数
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断闰年
bool judge(int year, int month, int day){
	// 被400整除,被4整数并不被100整除
	if(year % 400 == 0 || year % 4 == 0 && year % 100 != 0){
		months[2] = 29;
	}
	if(day > months[month] || day <= 0) return false;
	months[2] = 28;  // 恢复月份的状态
	return true;
} 

// 判断完全平方数
bool sqrtNum(int num){
	int temp = 0;
	while(num){
		temp += num % 10;
		num /=10;
	}
	if(hashMap[temp]){  // 查找到这个数是否为一个完全平方数
		return true;
	} 
	return false;
}


void solve(){
	const int cl = 20010101;
	const int cr = 20211231;
	int year,month,day;
	int ans = 0;
	for(int i = 1;i <= 9;i ++){
		hashMap[i * i] = 1;   // 初始化哈希数组
	}

	for(int i = cl; i <= cr;i ++){
		int temp = i;
		// 首先分割为年月日,不能对i直接进行分割,否则会导致死循环
		day = temp % 100;
		temp /= 100;
		month = temp % 100;
		if(month <= 0 || month > 12) continue;    // 如果月份不合法就直接进行跳过
		temp /= 100;
		year = temp;
		if(judge(year, month, day)){
			if(sqrtNum(i)){
				ans++;
			} 
		}
	}
	cout<<ans<<endl;
	return ;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	while(t--){
		solve();
	}
	return 0;
} 
相关推荐
十二2 天前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
Pniubi2 天前
力扣560.和为k的子数组
算法·leetcode·职场和发展
Pniubi2 天前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
MUSHANGXS3 天前
大模型时代的新蓝海-基于OS底层的AI-Agent应用
人工智能·职场和发展·交互
Yuzhiyuxia3 天前
【AI Agent面试系列】上下文管理1
人工智能·面试·职场和发展
青少儿编程课堂3 天前
蓝桥杯青少组省考(11/9报名截止·11/22开考)+电子学会图形化考级+信息素养大赛:校园极速跑酷闯关解析
蓝桥杯·scratch·图形化编程·信息素养大赛·电子学会考级
CoderYanger3 天前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
lsc_blog4 天前
年底还在招的岗位,先确认缺口和到岗要求
git·缓存·ci/cd·职场和发展·github
Pniubi4 天前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展