赞
踩
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如:2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 162+0+2+1+6+5=16,而 16 是一个完全平方数,它是 44 的平方。所以 20212021 年 6 月 5 日是一个完全日期。
例如:2021年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 162+0+2+1+6+2+3=16,是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
请问,从 2001 年 1月 1日到 2021年 12 月 31日中,一共有多少个完全日期?
// 导入必要的标准库 #include <bits/stdc++.h> using namespace std; // 预定义每个月的天数,其中二月默认为28天,闰年时会修改 int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 定义一个检查函数,用来判断某个日期的年月日数字和是否为完全平方数 bool check(int n) { int sum=0; // 定义一个变量来存储数字和 // 使用循环来计算年月日所有数字的和 while(n) { sum+=n%10; // 计算当前最低位的数字,并加到和中 n/=10; // 将数字右移一位,即去掉已经处理的最低位 } // 从1到8遍历所有可能的平方数(因为数字和不会超过两位数的完全平方数) for(int i=1;i<=8;i++) { // 如果i的平方等于数字和,则返回true,表示这是一个完全日期 if(pow(i,2)==sum) return true; } // 如果所有的平方数都不匹配,则返回false return false; } // 主函数 int main() { int ans=0; // 用于存储完全日期的总数 // 遍历2001年到2021年所有的年份 for(int i=2001;i<=2021;i++) { // 判断当前年份是否为闰年,并设置二月的天数 if(i%4==0&&i%100!=0||i%400==0) months[2]=29; else months[2]=28; // 遍历每个月 for(int j=1;j<=12;j++) { // 遍历每天 for(int k=1;k<=months[j];k++) { // 生成当前日期的数字形式,如20210605 int num=i*10000+j*100+k; // 调用check函数检查当前日期 if(check(num)) ans++; // 如果是完全日期,计数器加1 } } } // 输出完全日期的总数 cout<<ans; return 0; }
代码的主要逻辑是遍历指定日期范围内的每一天,将年月日组成一个整数,并计算这个整数每位数字的和,然后检查这个和是否是1到8中某个数的平方,如果是,则将该日期视为“完全日期”,并对完全日期的总数进行计数。最后,输出在指定日期范围内的完全日期总数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。