蓝桥杯 试题A 门牌制作

 

答案:624 

#include<iostream>
using namespace std;

int ans;
int cal(int n)
{
    int sum = 0;
    while(n)
    {
        if(n % 10 == 2) sum++;
        n /= 10;
    }
    return sum;
}
int main()
{
    for(int i = 1; i <= 2020; i++)
    {
        ans += cal(i);
    }
    cout << ans << endl;
    return 0;
}

 

### 蓝桥杯 C++ 门牌制作 解题思路 #### 题目背景分析 蓝桥杯中的“门牌制作”问题通常涉及统计某些特定条件下的数字特性。例如,在一定范围内计算某个数字出现的次数或者满足某种性质的数字数量。这类题目往往可以通过枚举、字符串处理以及简单的数学逻辑来实现。 --- #### 示例代码解析 以下是基于上述引用内容构建的一个典型解决方案,用于解决类似于“在给定范围内的所有正整数中,统计某一位数字(如‘2’)出现的总次数”的问题: ```cpp #include <iostream> using namespace std; int main() { int sum = 0; // 记录目标数字出现的总次数 for (int i = 1; i <= 2020; i++) { // 假设范围是从1到2020 int x = i; while (x) { // 对当前数字逐位分解 if (x % 10 == 2) { // 判断最后一位是否为目标数字'2' sum++; } x /= 10; // 移除最后一位继续判断下一位 } } cout << sum << endl; // 输出最终的结果 } ``` 此代码片段通过遍历指定区间 `[1, 2020]` 的每一个数字 `i`,并利用 `while` 循环逐一提取每一位上的数值进行比较[^2]。如果该位等于目标数字 ‘2’,则计数器变量 `sum` 自增一次。 --- #### 关键算法说明 为了提高效率和可扩展性,可以采用分治的思想优化原始暴力解法。具体而言,对于任意范围 `[L, R]` 和目标数字 `d`,其核心思想在于按位拆解整个区间的贡献量而非单独考虑每个数字。这种方法的时间复杂度接近于 O(log N),远优于朴素做法的 O(N log N)[^3]。 以下是一个更高效的版本示例: ```cpp #include <iostream> using namespace std; // 辅助函数:计算 [0, num] 中 digit 出现的次数 long long countDigit(long long num, int digit) { long long cnt = 0; for (long long factor = 1; factor <= num; factor *= 10) { long long divider = factor * 10; cnt += (num / divider) * factor + min(max(num % divider - digit * factor + 1, (long long)0), factor); } return cnt; } int main() { long long L = 1, R = 2020; // 给定范围 [L, R] int target_digit = 2; // 目标数字 '2' // 总共出现的次数为 [0,R] - [0,L-1] long long result = countDigit(R, target_digit) - countDigit(L - 1, target_digit); cout << result << endl; // 输出结果 } ``` 在此改进版程序中引入了一个辅助函数 `countDigit()` 来高效地求取某一固定区间内目标数字的具体分布情况[^4]。相比之前直接模拟的方式更加简洁明了且性能优越。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值