蓝桥杯 试题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;
}

 

### 关于蓝桥杯 Java 门牌制作的解题思路 为了计算从1到2020之间所有门牌号码中字符'2'的数量,可以逐个遍历这些数字并统计其中含有字符'2'的情况。具体来说,对于每一个整数n (1 ≤ n ≤ 2020),将其转换成字符串形式以便逐一检查每一位上的数值是否等于'2'[^1]。 考虑到这种方法可能会比较低效,更高效的解决方案是从数学角度出发考虑各个位置(千位、百位、十位和个位)上可能出现‘2’的情形,并累加起来得出总数。这样做的好处是可以减少不必要的循环次数,提高程序效率[^3]。 #### 数学分析法求解过程: - 对于任意给定范围内的自然数序列而言,在某一位上出现特定数字的概率是相等的; - 当我们关注的是某个固定的位置时(比如个位),那么在整个区间内该位置取值为指定数字的机会应该是均匀分布的; - 基于此原理,可以通过简单的除法运算来估算出每个位置上有多少次出现了目标数字; 针对此问题中的特殊情况——即最高位可能不是满位情况,则需单独处理最左边那部分不完整的子区间。 ```java public class Doorplate { public static void main(String[] args) { int count = 0; for(int i=1; i<=2020; ++i){ String strI = Integer.toString(i); for(char c : strI.toCharArray()){ if(c=='2') ++count; } } System.out.println(count); // 输出最终结果 } } ``` 上述代码实现了通过迭代方式解决这个问题的方法。然而,如果追求更高的性能优化,建议采用基于数学规律的方式来进行快速计算而不是暴力枚举。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值