蓝桥杯 — — 完全日期

完全日期

友情链接:完全日期

题目:

思路:

直接从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;
} 
相关推荐
m0_675988231 小时前
Leetcode3218. 切蛋糕的最小总开销 I
c++·算法·leetcode·职场和发展
黑客老陈3 小时前
面试经验分享 | 北京渗透测试岗位
运维·服务器·经验分享·安全·web安全·面试·职场和发展
测试杂货铺9 小时前
Jmeter压测实战:Jmeter二次开发之自定义函数
自动化测试·软件测试·测试工具·jmeter·职场和发展·测试用例·压力测试
呆呆的猫10 小时前
【LeetCode】227、基本计算器 II
算法·leetcode·职场和发展
测试老哥10 小时前
外包干了两年,技术退步明显。。。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
测试199813 小时前
外包干了2年,技术退步明显....
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
开发者每周简报18 小时前
求职市场变化
人工智能·面试·职场和发展
@小码农20 小时前
202411 第十六届蓝桥杯青少组 STEMA 考试真题 汇总
职场和发展·蓝桥杯
ProcessOn官方账号20 小时前
如何绘制网络拓扑图?附详细分类解说和用户案例!
网络·职场和发展·流程图·拓扑学
贵州晓智信息科技1 天前
如何优化求职简历从模板选择到面试准备
面试·职场和发展