洛谷P15963 日期统计

题目:

原题链接:https://www.luogu.com.cn/problem/P15963?contestId=314564

前言:

这是洛谷的蓝桥杯模拟赛的第一题,主要考察有关日期转换和暴力枚举,难度不是很大。本来我想使用C++中的<ctime>库,但是题目中要统计到 9876 年 1 月 1 日,由于<ctime>中的秒数使用long long定义的,所以不能计算到9876年,那么我们就要自己自定义函数实现统计2239 年 9 月 9 到 9876 年 1 月 1 日的每一天。()

题目分析:

根据题目分析,就是从2239 年 9 月 9 日到 9876 年 1 月 1 日中统计某一天日期出现相同数字的次数是否想等,例如 2221年1月11日,其中2出现了3次,1也出现了3次,所以这一天符合要求。

根据题目分析我们可以从2239年9月9日遍历到9876年1月1日,使用数组来统计这一天中不同数字出现的个数,然后再判断数组中非零的元素是否相等,如果相等就证明这一天的日期符合题目要求。

代码实现:

1.判断是否为闰年

当该年份可以被400整除或者可以被4整除但是不能被100整除时该年份是闰年,否则为平年;

bool JudgeYear(int year){
    if(((year % 4 == 0) && year % 100 != 0) || (year % 400 == 0)){
        return true;
    }else{
        return false;
    }
}

2.遍历日期

遍历从2239 年9月9日到9876年1月1日的每一天并将其转化为字符串,便于统计

            //1  2  3  4  5  6  7  8  9 10 11 12    月份对应时间表
int mon[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int year = 2239;
int month = 9;
int day = 9;
while(year <= 9876){
    string s1;
    s1 += to_string(year);
    s1 += to_string(month);     //使用to_string()函数,可以直接将数字转换为字符串,在竞赛中常常用到   
    s1 += to_string(day);
    if(year == 9876 && day == 1 && month == 1) break;  //⚠️注意如果不这样写仅仅是使用while的循环条件时,会多统计 1 年
    day++;
    if(JudgeYear(year)){        //闰年2月29
        mon[1] = 29;
    }else{
        mon[1] = 28;            //平年2月28
    }
    if(day > mon[month-1]){     // ⚠️注意这里不能写 day == mon[month-1], 否则最后一天没有被统计
        day = 1;                //当天数到达这个月的最后一天时,month加一,同时将day 置为1
        month++;
    }
    if(month > 12){
        month = 1;              //当month > 12 时,将year加一,同时将mouth置为1    
        year++;
    }
}    

3.统计日期中数字出现的个数

int num[10] = {0};                          //定义一个大小为10的数组,用于统计0-9数字出现的个数
for(int i = 0; s1[i] != '\0'; i++){
    num[s1[i]-'0']++;                   //在对应数字的下标下进行自加就可以实现统计数字出现的个数
}    

4.判断数字出现的个数是否相等

bool JudgeSameNum(int a[]){
    int temp = 0;
    bool val = false;
    for(int i = 0; i < 10; i++){
        if(a[i] != 0){                  //以第一个非零元素出现的次数作为判断的条件
            if(!val){
                temp = a[i];
                val = true;
            }else{
                if(a[i] != temp){       //如果有不相等的元素出线则返回false
                    return false;
                }
            }
        }
    }
    return true;
}

5.在日期遍历中进行检查,如果符合则sum++

if(JudgeSameNum(num)) sum++;

整体代码:

#include <iostream>
using namespace std;
bool JudgeYear(int year){
    if(((year % 4 == 0) && year % 100 != 0) || (year % 400 == 0)){
        return true;
    }else{
        return false;
    }
}

bool JudgeSameNum(int a[]){
    int temp = 0;
    bool val = false;
    for(int i = 0; i < 10; i++){
        if(a[i] != 0){
            if(!val){
                temp = a[i];
                val = true;
            }else{
                if(a[i] != temp){
                    return false;
                }
            }
        }
    }
    return true;
}


int main(){
    //cout << JudgeYear(2019) << endl;
    //2239 年 9 月 9 日到 9876 年 1 月 1 日
            //     1  2  3. 4  5. 6. 7. 8. 9. 10. 11 12
    int mon[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int year = 2239;
    int month = 9;
    int day = 9;
    int sum = 0;
    while(year <= 9876){
        string s1;
       
        
        s1 += to_string(year);
        s1 += to_string(month);        
        s1 += to_string(day);
        int num[10] = {0};
        for(int i = 0; s1[i] != '\0'; i++){
            num[s1[i]-'0']++;
        }
        if(JudgeSameNum(num)) sum++;
        
        if(year == 9876 && day == 1 && month == 1) break;  
        day++;

        if(JudgeYear(year)){
            mon[1] = 29;
        }else{
            mon[1] = 28;
        }
        if(day > mon[month-1]){  
            day = 1;
            month++;
        }
        if(month > 12){
            month = 1;
            year++;
        }
    }
    cout << sum << endl;
}
//210778

⚠️注意:转换为字符串和判断应发生在day++前,否则不能完全遍历每一天

总结:

作为签到题来说,这题难度不大,但要注意一些细节问题,我也是改了好几次才过(^~^),这道题的结果是210778,如果有错误还请指正。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇