题目链接:P10424 [蓝桥杯 2024 省 B] 好数

这个题求1-N之间的好数,也就是一个数字从低位到高位,奇数位是奇数,偶数位是偶数,就是一个好数.

直接for循环从1遍历到n.然后分别判断每个数是不是好数即可.

cpp代码如下:

#include<iostream>
using namespace std;
#include<string> 
#include<algorithm> 
int main()
{
    int n=0;
    cin>>n;
    int count=0;
    for(int i=1;i<=n;i++)
    {
        // 将数字转成字符串,然后反转. 
        string s=to_string(i);
        reverse(s.begin(),s.end());
        bool flag=1;
        //反转后的字符串,最高位就是原本的奇数位了,然后往后遍历. 
        for(int j=0;j<s.size();j++)
        {
            //如果j能被2整除,比如0,那其实是奇数位. 
            if(j%2==0)
            {
                //奇数位如果被2整除就不符合条件. 
                if((s[j]-'0')%2==0)
                {
                    flag=0;
                    break; 
                }
            }else{
                //偶数位不能被2整除就不符合条件. 
                if((s[j]-'0')%2!=0)
                {
                    flag=0;
                    break; 
                }
            }
        }
        //如果所有数位都符合条件,flag依然是1,然后统计次数加一次. 
        if(flag)count++;
    }
    //最后打印一下 
    cout<<count<<endl;
}

python代码如下:

def check(x):
    # cnt标志是奇数位还是偶数位,
    cnt=1
    # x不为0就一直对10取模求最后一位,然后整除10去掉最后1位
    while x!=0:
        t=x%10
        x//=10
        if cnt&1:
            # 如果cnt是奇数,t是偶数就不符合条件,直接返回False
            if t%2==0:
                return False
        else:
            # 如果cnt是偶数,t是奇数就不符合条件,直接返回False
            if t%2==1:
                return False
        cnt+=1
    return True
        
n=int(input())
count=0
for i in range(1,n+1):
    if check(i):
        count+=1
print(count)

python代码的话需要用到pypy3才可以通过,毕竟题目给的数量级达到了$10^7$,每判断一个数也需要一个循环.就会超时了.