做前注意事项

P2010 [NOIP2016 普及组] 回文日期

JeiMin @ 2024-08-06 00:03:36

1.暴力能过但超级复杂,暴力的话要开3500000的长度(仅存个数的),仔细想一想优化;

2.回文的判断可以使用字符串,会好写一点:

bool hui(string s) {
    // 检查字符串是否是回文
    int left = 0,right=s.size()-1;
    while (left < right) {
        if (s[left++] != s[right--]) {
            return false;
        }
    }
    return true;
}

3.养成好习惯,写完再看题解哦。

羸弱求各位点点赞吧。


by xjsmsms @ 2024-08-06 07:18:35

@JeiMin

请勿将题解/思路等发在讨论区


by abc20131113 @ 2024-08-18 17:38:26

#include<bits/stdc++.h>  
using namespace std;  
int n[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};  
int main(){  
//  freopen(".in","r",stdin);  
//  freopen(".out","w",stdout);  
    int f,t;  
    cin>>f>>t;  
    int y=f/10000;     
    int m=f%10000/100;  
    int r=f%100;  
    int sum=0;  
    while(y*10000+m*100+r<=t){  
        if(y%400==0||y%100!=0&&y%4==0){  
            n[2]=29;  
        }  
        else{  
            n[2]=28;  
        }  
        int a,b,c,d;  
        d=m/10;  
        c=m%10;  
        b=r/10;  
        a=r%10;  
        if(d+10*c+100*b+1000*a==y){   
            sum++;  
        }  
        if(d+1>n[m]){  
            d=0;  
            m++;  
        }  
        if(m>12){  
            m=1;  
            y++;  
        }  
        r++;  
    }  
    cout<<sum;  
    return 0;  
}

这咋写


by abc20131113 @ 2024-08-18 17:56:40

@JeiMin


by JeiMin @ 2024-08-18 22:44:16

#include<bits/stdc++.h>  
using namespace std;  

int n[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  

int main() {  
    int f, t;  
    cin >> f >> t;  

    // 初始化起始日期的年、月、日  
    int fy = f / 10000;  
    int fm = (f % 10000) / 100;  
    int fd = f % 100;  

    int sum = 0;  

    // 遍历日期直到超过终止日期  
    while (f <= t) {  
        // 判断是否为闰年并设置2月的天数  
        if (fy % 400 == 0 || (fy % 100 != 0 && fy % 4 == 0)) {  
            n[2] = 29;  
        } else {  
            n[2] = 28;  
        }  

        // 提取当前日期的月和日,并转换为整数  
        int m = fm;  
        int d = fd;  

        // 提取月和日的每一位数字  
        int md = m / 10;  
        int md2 = m % 10;  
        int dd = d / 10;  
        int dd2 = d % 10;  

        // 检查是否为回文日期  
        if (md * 1000 + md2 * 100 + dd * 10 + dd2 == fy) {  
            sum++;  
        }  

        // 日期递增逻辑  
        fd++;  

        // 处理日期的进位  
        if (fd > n[fm]) {  
            fd = 1;  
            fm++;  

            if (fm > 12) {  
                fm = 1;  
                fy++;  
            }  
        }  

        // 更新当前日期f,以便下一次循环使用  
        f = fy * 10000 + fm * 100 + fd;  
    }  

    cout << sum << endl;  
    return 0;  
}

@yunxinrui

1.日期递增逻辑:日期递增的逻辑不够清晰,且没有正确地更新f的值。在修改后的代码中添加了f的更新,以确保每次循环都处理下一个日期。

2.回文日期判断:代码中回文日期的判断条件似乎有误。更改为直接比较年月日和年是否构成回文。

3.变量命名:更改了一些变量名以提高代码的可读性。

4.逻辑结构:调整了循环的结构,使其更加清晰和易于理解。


by abc20131113 @ 2024-08-19 09:15:05

@JeiMin 谢谢


|