【每日一题】【枚举】【估计时间复杂度】[蓝桥杯 2024 省 B] 好数 C++

avatar
作者
猴君
阅读量:0

P10424 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数

题目描述

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。

给定一个正整数 N N N,请计算从 1 1 1 N N N 一共有多少个好数。

输入格式

一个整数 N N N

输出格式

一个整数代表答案。

样例 #1

样例输入 #1

24 

样例输出 #1

7 

样例 #2

样例输入 #2

2024 

样例输出 #2

150 

提示

样例 1 解释

24 24 24 以内的好数有 1 , 3 , 5 , 7 , 9 , 21 , 23 1,3,5,7,9,21,23 1,3,5,7,9,21,23,一共 7 7 7 个。

数据规模与约定

  • 对于 10 % 10\% 10% 的测试数据, 1 ≤ N ≤ 100 1 \leq N \le 100 1N100
  • 对于全部的测试数据, 1 ≤ N ≤ 1 0 7 1 \le N \leq 10^7 1N107

做题思路

做蓝桥杯的题首先要看数据规模和运行时间,第二看时间复杂度。

这道题最暴力的做法就是从1到 n n n枚举,然后每一个数字都判断一下是否为好数即可。

从时间复杂度来看
粗略估计:
从1到n每次最多内循环7次,总共 O ( 7 N ) O(7N) O(7N)
因为 1 ≤ N ≤ 1 0 7 1 \le N \leq 10^7 1N107
所以不会超时。

顺便说说如何判断是否为好数。

一个数按位且1后是判断最后一位(最低位)是为奇数,如果按位且1后答案为1那么最低位就是奇数;否则为偶数。

这里还用到了按位异或判断是否一致,也就说奇数位(个位、百位、万位……)上的数字是不是奇数的判断。

if((x&1) ^ k)return false; 

如果不看数据规模和运行时间、时间复杂度,首先想着优化就完蛋了。

时间复杂度分析

粗略估计:
从1到n每次最多内循环7次,总共 O ( 7 n ) O(7n) O(7n)

代码

#include <iostream> #include <algorithm> #include <vector> using namespace  std; bool check(int x){     bool k = true;     while(x){         if((x&1) ^ k)return false;         k^=true;         x/=10;     }     return true; } int main(){     int n,cnt = 0;cin >> n;     for(int i=1;i<=n;i++)         if(check(i))cnt++;     cout << cnt;     return 0; } 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!