题目
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
#include <bits/stdc++.h> using namespace std; int main() { int ans = 0, x; for (int i = 1; i <= 2020; i++) { x = i; while (x) { ________________; } } cout << ans; return 0; }
分析
为了计算从1到2020号门牌中总共需要多少个字符'2',我们需要在循环中检查每一位数字是否是'2'。我们可以使用取模运算(%
)和整除运算(/
)来提取每一位数字。
在空白处,我们需要做的是检查当前位(x % 10
)是否为'2',如果是,则增加ans
的计数。然后,我们需要将x
除以10来移动到下一位数字。
代码
#include <iostream> using namespace std; int main() { int ans = 0; for (int i = 1; i <= 2020; i++) { int x = i; while (x > 0) { int digit = x % 10; // 提取当前位的数字 if (digit == 2) { ans++; // 如果当前位是'2',则增加计数 } x /= 10; // 移动到下一位数字 } } cout << ans; return 0; }
java代码
//小蓝要为一条街的住户制作门牌号。 // //这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。 // //小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。 // //请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2? public static void main(String[] args) { int menpai = 2020; int count = 0; for (int i = 1; i <= menpai; i++) { String s = String.valueOf(i); int i2 = StringUtils.countMatches(s, "2"); if (i2 > 0) { System.out.println("门牌号===" + s); count += i2; } } System.out.println("需要" + count + "个字符 2"); }