文章归档算法题解

洛谷-P10424 [蓝桥杯 2024 省 B] 好数

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

题目要求统计 1 到 N 之间的好数。数位从低到高、从第 1 位开始编号:奇数位上的数字为奇数,偶数位上的数字为偶数,才算好数。

可以从 1 枚举到 n,逐个检查数位。C++ 写法将数字转成字符串后反转,从个位开始检查;Python 写法则反复对 10 取模,检查完个位后整除 10,继续处理下一位。

C++ 代码如下:

C++
#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 代码如下:

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 才能通过。题目数量级达到 10710^7,每个数还要逐位检查,解释器和评测环境会影响运行时间。

谢谢你读到这里。 ✧
搜索文章

输入关键词,找一篇想读的手记。

算法专题leetcode双指针经典练习题算法题解leetcode-1438. 绝对差不超过限制的最长连续子数组算法题解leetcode-179. 最大数算法题解leetcode-239. 滑动窗口最大值算法题解leetcode-136. 只出现一次的数字算法专题leetcode动态规划基础练习题算法专题leetcode二叉树基础练习题算法专题leetcode数组双指针练习题算法专题leetcode滑动窗口练习题算法专题leetcode链表双指针练习题算法题解洛谷-P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题算法题解leetcode-1979. 找出数组的最大公约数算法题解洛谷-B3634 最大公约数和最小公倍数算法题解洛谷-P10424 [蓝桥杯 2024 省 B] 好数算法题解洛谷-P8716 [蓝桥杯 2020 省 AB2] 回文日期自动化脚本Dr.com校园网自动登录方案算法题解leetcode-2226. 每个小孩最多能分到多少糖果算法题解leetcode-2563. 统计公平数对的数目算法题解leetcode-1.两数之和算法题解洛谷-P8218 【深进1.例1】求区间和
在这座小岛上,慢慢找。ESC 关闭